用 WHERE 子句替 HAVING 子句,是 Oracle SQL 性能优化里蛮常见也挺有效的一招。多人写查询习惯性就上 HAVING,其实不太必要。
HAVING 是对分组之后的结果再过滤,也就是说你数据全拉出来,算完平均值之类的,再来筛。说白了,就是有点晚。
像下面这个例子:
SELECT REGION, AVG(LOG_SIZE)
FROM LOCATION
GROUP BY REGION
HAVING REGION != 'SYDNEY' AND REGION != 'PERTH'
看起来没毛病吧?但效率就不咋地。你换成这样写:SELECT REGION, AVG(LOG_SIZE)
FROM LOCATION
WHERE REGION != 'SYDNEY' AND REGION != 'PERTH'
GROUP BY REGION
性能立马提升。为什么?因为 WHERE 先把你不想要的数据扔了,后面分组和聚合要的行数就少了,响应也快。
哦对,还有一点,Oracle 执行顺序是:WHERE > GROUP BY > HAVING,搞清楚这点,你才能写出更靠谱的 SQL。
如果你常写报表、后台管理那种聚合多的查询,强烈建议你优先考虑用WHERE
来筛选数据,能省不少事。
想多了解点类似的优化技巧?推荐几个文章,挺实用的: