请高手帮忙看看
有两个查询语句 
select * from A,B where A.时间=B.时间-1 (+) and A.ID=B.ID (+) and A.时间='200804'
select * from A,B where A.时间=B.时间-1 (+) and A.ID=B.ID (+) and B.时间='200804'
注: (+)表示外连接A表每个月30万条记录(共有记录1000万),B表每个月10万条记录(共有记录300万),
两个表都按时间(月)分区
A表建立了复合索引ON(时间,ID),B表建立了复合函数索引ON(时间-1,ID),并通过复合索引字段进行外连接问:为什么用A表时间作为条件只需40秒,而用B表时间作为条件却需要180秒,当一定要用B表时间做条件,有无办法提高其查询效率

解决方案 »

  1.   

    因为a表数据量大,A.时间='200804' 可以过滤掉大量的数据。
    而b表数据量小。B.时间='200804' 过滤的数据比A少
      

  2.   

    建议楼主找本数据库(sql)优化的书看看
      

  3.   

    没有基于cbo的执行计划,分析不出来。初步估计:B表建立了复合函数索引ON(时间-1,ID)
    这个有点问题,为什么不是:B表建立了复合函数索引ON(时间, ID)呢?
      

  4.   


    有关系呀,B表建立了复合函数索引ON(时间-1,ID)  === 这个索引是函数索引。
      

  5.   


    因为两个表的关联是用A.时间=B.时间-1,所以B表建立了复合函数索引ON(时间-1,ID)
      

  6.   

    8楼,按你说的情况,可以考虑在表B建一个索引, on B(时间, id); 可以考虑强制使用这个索引,并与之前的执行情况做一个比较
      

  7.   


    关联用A.时间=B.时间-1 (+) and A.ID=B.ID (+) 索引on B(时间, id),这样岂不是用不上索引?
      

  8.   

    最好是对这两个语句作一个trace来比较.events 10046和10053都来一个吧.
      

  9.   

    楼主,你最后速度提高,是不是自已改成:select * from A,B where A.ID=B.ID (+) and A.时间= '200803' and  B.时间='200804' 速度就快了?
      

  10.   

    select * from A,B where A.时间=B.时间-1 (+) and A.ID=B.ID (+) and A.时间='200804' 
    select * from A,B where A.时间=B.时间-1 (+) and A.ID=B.ID (+) and B.时间='200804' 
    上面两个语句中第二个语句实际上结果和
    select * from A,B where A.时间=B.时间-1 and A.ID=B.ID and B.时间='200804' 
    是等效的,但执行计划很不一样,实际上你的语句被实现有不必要的外联接.修改你的语句为下面等效语句,相信查询会快很多