日期:2014-05-17  浏览次数:20721 次

两个分区表关联后慢的问题,高手看看吧
表t的分区是按列day_id的日期的每一天分区的,
(如20091201、20091202、每天一个分区每个分区中有两百万条数据,每个月有5000万条数据)


表b的分区是按列mn的月份分区的,
(如200912、200911、每个月份一个分区每个分区中有二十万条数据,每个月有20万条数据)


表t和表b都在code字段上建有索引,是local索引,create index on ..(code) local


1: 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