我有2个表a和b,a表13万行,b表41万行,现在做了个查询,分两步:
1.从a表选择部分记录存入中间表,结果大约有150行,有distinct。
2.把上面的中间表和b表连接,加上一些对b表的限制条件,统计后输出结果。
注:如果把中间表和b表直接连接,结果大约200多行。
我的问题是:
如果我按照上述的步骤搞个中间表,分两步查询,那么查询时间可以忽略不计。如果我合二为一,那么不论我使用子表,exists,还是in,结果都是17秒。
这个好像差太远了吧,有没有什么提高速度的办法?
优化

解决方案 »

  1.   

    分两步的大致是这样:
    select distinct a_1 into temp1 from a where ...
    select * from temp1 c join b on ... where ...
    一步的大致是这样:
    select * from (select distinct a_1 from a where ...) as c join b on ... where ...
    这看起来没多少区别啊,我想服务器处理的时候总该是先把括号里的算出来,然后再算别的吧,那样不就一样了。有没有办法让服务器先算括号里的语句呢?
      

  2.   

    2个表直接关联的查询计划是什么?
    中间表150行再和b关联无论怎么join都会很快
      

  3.   

    建议用hash join 尝试一下
      

  4.   

    select * from (select distinct a_1 from a where ...) as c inner hash join b on ... where ...
      

  5.   

    我猜测它的执行计划是分了两个线程,一个线程执行括号内的语句,一个线程按照括号外的where语句对表b进行查询,等这两个线程都执行完了,再进行连接。
    因为表b很大,所以整个时间就拖长了。如果先括号内查询,再和外面连接反而快。
    这个执行计划应该是自动生成的,没法控制。
    在这个执行计划下,我认为hash join 应该没效果。
    不过还是谢谢你