有两个百万级的大表a,b,  其中a表有数据两百多万条。b表有1千多万条。a表为主表。
现在需要关联两个表查询是否存在满足条件的记录
 
  select   count(a.id)   from   a,b   where   a.id=b.id and b.cate="+cateid+"
  select a.* from a,b   where   a.id=b.id and b.cate=="+cateid+"
  
   这两个表主要执行的sql为select操作 ,查询得到的结果一般都在几万条以上
   请教如何提高效率。
  
  另外我看了论坛上http://topic.csdn.net/t/20051111/15/4387478.html的文章,对与
select   count(a.id)   from   a,b   where   a.id=b.id   and ....

select   1   from   dual   
  where   exists   (select   1   from   a,b   where   a.id=b.id   and   ...);
得到的结果是完全不一样的,不明白楼主说用后一种方法解决了效率的问题

解决方案 »

  1.   


    1.在A,B的ID上建索引
    2.where条件的执行顺序是:从where语句条件的最后一个开始逐渐执行,因此希望楼主把能把范围缩小到最小的条件放在where语句的最后,具体条件,楼主可以根据自己的情况自己写。 3.  ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,因此FROM子句中写在最后的表(基础表   driving   table)将被最先处理。   在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。当ORACLE处理多个表时,   会运用排序及合并的方式连接它们。首先,扫描第一个表(FROM子句中最后的那个表)并对记录进行派序,然后扫描第二个表(FROM子句中最后第二个表),最后将所有从第二个表中检索出的记录与第一个表中合适记录进行合并。 
            例如: 
                表   TAB1   16,384   条记录 
                表   TAB2   1             条记录 
                选择TAB2作为基础表   (最好的方法) 
            select   count(*)   from   tab1,tab2       执行时间0.96秒 
                选择TAB2作为基础表   (不佳的方法) 
            select   count(*)   from   tab2,tab1       执行时间26.09秒 
      

  2.   

    1 直接用关联即可,不要用exist2 楼上所说的基础表的事,在9i,10gCBO的优化器中,oracle一般能自行搞定,估计楼上人没试过