我有2个表a和b,a表13万行,b表41万行,现在做了个查询,分两步:
1.从a表选择部分记录存入中间表,结果大约有150行,有distinct。
2.把上面的中间表和b表连接,加上一些对b表的限制条件,统计后输出结果。
注:如果把中间表和b表直接连接,结果大约200多行。
我的问题是:
如果我按照上述的步骤搞个中间表,分两步查询,那么查询时间可以忽略不计。如果我合二为一,那么不论我使用子表,exists,还是in,结果都是17秒。
这个好像差太远了吧,有没有什么提高速度的办法?
优化
1.从a表选择部分记录存入中间表,结果大约有150行,有distinct。
2.把上面的中间表和b表连接,加上一些对b表的限制条件,统计后输出结果。
注:如果把中间表和b表直接连接,结果大约200多行。
我的问题是:
如果我按照上述的步骤搞个中间表,分两步查询,那么查询时间可以忽略不计。如果我合二为一,那么不论我使用子表,exists,还是in,结果都是17秒。
这个好像差太远了吧,有没有什么提高速度的办法?
优化
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 ...
这看起来没多少区别啊,我想服务器处理的时候总该是先把括号里的算出来,然后再算别的吧,那样不就一样了。有没有办法让服务器先算括号里的语句呢?
中间表150行再和b关联无论怎么join都会很快
因为表b很大,所以整个时间就拖长了。如果先括号内查询,再和外面连接反而快。
这个执行计划应该是自动生成的,没法控制。
在这个执行计划下,我认为hash join 应该没效果。
不过还是谢谢你