SQL表关联中的逻辑与效率(二)

来源:互联网 发布:乐乎 编辑:程序博客网 时间:2024/06/16 01:19

之前写的《SQL表关联中的逻辑与效率》一开始计划的是还要写group by在关联中的效率问题的,结果写到一半被人叫走了给忘了……于是在这里补充一篇

接上一篇文章http://blog.csdn.net/strangerzz/article/details/45746621

二、关联中的group by
考虑下面两条语句

语句1    SELECT        t1.oid,        SUM(t2.f0007)    FROM        wrnophq.ne_cell_w t1    INNER JOIN        wrnophq.PERF_CELL_W_TRAFFIC_3 t2    ON        t1.oid = t2.oid    GROUP BY        t1.oid;

对比

语句2    SELECT        t1.oid,        t2.f0007    FROM        xxxx t1    INNER JOIN        (            SELECT                oid,                SUM(f0007) f0007            FROM                yyyy            GROUP BY                oid) t2    ON        t1.oid = t2.oid;

语句2的执行顺序已经很明显了,这里仅贴出语句1的执行计划如下:
语句1执行计划
可以看到,在这种语句中,语句1是先做关联,再做group by的。而语句2中先对t2做group by减少了结果的数量,再与t1做关联,这种方式的效率明显比t1的执行效率要高很多。

但是可以简单地用语句2代替语句1来提高查询效率吗?答案是否定的。因为根据处理的数据以及表关联的方式不同,语句1、2得到的结果并不总是相同的。比如,当t1和t2的关联为多对多的关联(即t1、t2中的oid都存在重复的时候,当然这种场景可能不多),或者当做JOIN的关键字段并没有全都出现在group by子句的时候(这种时候需要看具体情况了),以及其他一些我暂时没想到的情况。

总而言之,在一条语句中同时需要做group by和关联的时候,可以根据具体的情况来使用语句2的形式优化查询效率。

0 0
原创粉丝点击