oracle的执行过程:
先取得outer table即table2,
然后对于table2的每一条数据,到inner table (table1)中去找因此,如果table1比较小的话,上面的计划没有问题
如果table1比table2大,try:
select a.a1,a.a2,count(*) from table 2 b,table1 a where a.xh=b.xh and a.rq<to_date('2004.1.1','yyyy.mm.dd') and b.rq1<to_date('2004.1.1','yyyy.mm.dd');看执行计划是否有所改变,然后看一下效率会不会提高。

解决方案 »

  1.   

    bzszp(SongZip) 首先非常感谢你。
     bzszp(SongZip) 我不同意你的观点,我觉的表大的应该放在前面,如果后面的话,那不是要全表扫描了吗?
    还有,对于a.xh=b.xh放在where前还是后,我觉的应该在后,可是网上好多人讲在前面。
    还有可以避免后面的表全表搜索吗?
      

  2.   


    不知道是不是cbo方式,如果是cbo的话,oracle会根据实际情况对连接顺序进行调整,
    选择最佳的连接顺序以及join方式。上面的意思是,你改变一下连接顺序,看执行计划是否有所改变。
      

  3.   

    执行计划当然有变,table1作为全表扫描了啊
      

  4.   

    你table1和table2上的索引是在哪个字断上
      

  5.   

    索引在table1.xh,table2.rq和table2.xh,table2.rq1上,索引用不上select cllx, 1  clly, count(*),xzqh from vehicle where
        CCDJRQ<to_date('2004-06-20','yyyy/mm/dd')+1 and
        not (ZT like '%B%' or ZT like '%E%' or ZT like '%M%') and clly='1' group by Cllx,xzqh
    估计100万的数据量。使用了复合索引了,但是查询结果还是要6分钟
    sort_area_size=20m
      

  6.   

    table1 100多万,table2 10多万
      

  7.   

    先看看下面两个sql运行结果是什么。执行计划是什么
    1.select count(*) from table1 where rq<to_date('2004.1.1','yyyy.mm.dd') 2.select count(*) from table2 b where rq1<to_date('2004.1.1','yyyy.mm.dd')
      

  8.   

    TO shawnzhao 
    执行计划当然是用上了index了,这个是肯定的啊。
      

  9.   

    如何看lage_pool_size是否存在呢?
      

  10.   

    用上了index有时候是坏事,我想知道那两个sql统计的结果多少,关键在这里