两个分区表关联后慢的问题,高手看看吧
表t的分区是按列day_id的日期的
每一天分区的,
(如20091201、20091202、
每天一个分区,
每个分区中有两百万条数据,
每个月有5000万条数据)
表b的分区是按列mn的
月份分区的,
(如200912、200911、
每个月份一个分区,
每个分区中有二十万条数据,
每个月有20万条数据)
表t和表b
都在code字段上建有索引,是local索引,
create index on ..(code) local1: select t.code, max(t.time) from
t, b where
t.day_id between 20100101 and 20100131
and t.code=b.code
and b.mn=201001
group by t.code;
2: select t.code, max(t.time) from
t where
t.day_id between 20100101 and 20100131
group by t.code;
我自己感觉1的写法会比2快很多,
因为1的表b中只有20万条记录,
且在这个分区中每条记录的code是惟一的,这样一关联只有20万条记录。
而2有5000万条数据。
事实却恰恰相反,事实是2比1快很多,1慢得让人无法忍受。
为什么????
------解决方案--------------------看看执行计划吧
------解决方案--------------------试试看这样:
select t.code, max(t.time) from
t, b
where b.mn=201001
and t.code=b.code
and t.day_id between 20100101 and 20100131
group by t.code;
最好在B.mn 上有索引
------解决方案--------------------第一个是两表关联,实际是5000w*20w.....
------解决方案--------------------我看第一条SQL,就看见你跨分区查询了,能不慢吗?
------解决方案--------------------U_P 。。。。
------解决方案--------------------
用HINT优化吧........
5000万与20万,两表比例为250:1
可以用哈希关联
SELECT /*+USE_HASH(t,b)*/ t.code, max(t.time) from
t, b
where
t.day_id between 20100101 and 20100131
and t.code=b.code
and b.mn=201001
group by t.code
建议时间列上也建立索引 (day_id)
觉得慢的话,帖一下执行计划出来看看吧,,
用PL/SQL的,可以按F5来看到(选种所需语句)
命令行的话,可以打:explain plan for SQL..........(可能会提示需要建立计划表,创建便是,如需脚本,可以从ORACLE的RDBMS文件里面找到)
希望对你有帮助
------解决方案--------------------不用看,肯定是2块。1无缘无故还多了个join