注册
SQL优化初解——谓词下推
专栏/培训园地/ 文章详情 /

SQL优化初解——谓词下推

地球落流星 2024/11/07 392 1 0
摘要

上一篇,我们说到了SQL优化的基本原则和流程。
今天我们遵循流程,首先讲讲怎么进行语句分析和改写。
SQL语句的执行顺序如下
1,FROM子句:确定数据来源,包括JOIN的表。
2,ON:执行JOIN条件。
3,JOIN:如果有JOIN则根据JOIN类型(如INNER、LEFT)连接表。
4,WHERE子句:过滤记录。
5,GROUP BY子句:根据指定的列分组记录。
6,HAVING子句:过滤分组。
7,SELECT子句:选取特定的列。
8,DISTINCT子句:去除重复数据。
9,ORDER BY子句:最后对结果进行排序。
10,LIMIT / OFFSET子句(或者是TOP,或者是FETCH):最后的结果截取。

举个生活的例子:
我们在买一个东西的时候,通常我们需要先确定这个东西哪里有(确定数据来源),也就是确定东西哪里可以买到(join就是有多个来源,不同来源之间的关系就是(on),例如有淘宝,京东,拼多多,on就是货比三家。也可能会在多个平台买)。比如在淘宝,那我下一步就是在淘宝上去搜索筛选商店(where过滤),然后进入某个商店,选择分类型(分组)的东西,比如生活用品类,然后从分类型中选择具体的东西(select)。然后你又发现这个东西好几种样式的我都想要(不想买重就是distinct),难以取舍。那么就需要给他排下优先级(order by排序),哪个最想要我就要哪个,或者前三个我都要了(limit截取)。 这样最终我就买到我想要的了。

在了解了语句的执行顺序后,我们就能知晓为什么有些select语句的过滤条件的位置会对执行耗时有影响。说到这里,也就要说说在sql改写中占用重量地位的谓词下推了。

谓词下推:
简单说就是过滤条件下移,移到靠近数据源的位置。以尽早完成数据的过滤,从而显著减少数据传输或计算的开销。

举例说明:
select * from DMHR.EMPLOYEE e left join DMHR.DEPARTMENT d on d.DEPARTMENT_ID = e.DEPARTMENT_ID
where e.SALARY > 3000

优化方向:
将e.SALARY > 3000条件下推到数据源DMHR.EMPLOYEE的附近。

优化后SQL:
SELECT *
FROM (SELECT *
FROM "DMHR"."EMPLOYEE"
WHERE "SALARY" > 3000) "t"
LEFT JOIN "DMHR"."DEPARTMENT" ON "t"."DEPARTMENT_ID" = "DEPARTMENT"."DEPARTMENT_ID"

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服