从join on和where执行顺序认识T-SQL查询处理执行顺序
来源:互联网 发布:python proxyfix 编辑:程序博客网 时间:2024/05/18 02:59
SQL语句中join连表时on和where后都可以跟条件,那么对查询结果集,执行顺序,效率是如何呢?
通过查询资料发现:
区别:
on是对中间结果进行筛选,where是对最终结果筛选。
执行顺序:
先进行on的过滤, 而后才进行join。
效率:
如果是inner join, 放on和放where产生的结果一样, 但没说哪个效率速度更高? 如果有outer join (left or right), 就有区别了, 因为on生效在先, 已经提前过滤了一部分数据, 而where生效在后.
最后来了解下T-SQL对查询逻辑处理。
T-SQL逻辑查询的各个阶段:
(5)SELECT DISTINCT TOP(<top_specification>) <select_list>
(1)FROM <left_table> <join_type> JOIN <right_table> ON <on_predicate>
(2)WHERE <where_predicate>
(3)GROUP BY <group_by_specification>
(4)HAVING <having_predicate>
(6)ORDER BY <order_by_list>
T-SQL在查询各个阶级分别干了什么:
(1)FROM 阶段
FROM阶段标识出查询的来源表,并处理表运算符。在涉及到联接运算的查询中(各种join),主要有以下几个步骤:
a.求笛卡尔积。不论是什么类型的联接运算,首先都是执行交叉连接(cross join),求笛卡儿积,生成虚拟表VT1-J1。
b.ON筛选器。这个阶段对上个步骤生成的VT1-J1进行筛选,根据ON子句中出现的谓词进行筛选,让谓词取值为true的行通过了考验,插入到VT1-J2。
c.添加外部行。如果指定了outer join,还需要将VT1-J2中没有找到匹配的行,作为外部行添加到VT1-J2中,生成VT1-J3。
经过以上步骤,FROM阶段就完成了。概括地讲,FROM阶段就是进行预处理的,根据提供的运算符对语句中提到的各个表进行处理(除了join,还有apply,pivot,unpivot)
(2)WHERE阶段
WHERE阶段是根据<where_predicate>中条件对VT1中的行进行筛选,让条件成立的行才会插入到VT2中。
(3)GROUP BY阶段
GROUP阶段按照指定的列名列表,将VT2中的行进行分组,生成VT3。最后每个分组只有一行。
(4)HAVING阶段
该阶段根据HAVING子句中出现的谓词对VT3的分组进行筛选,并将符合条件的组插入到VT4中。
(5)SELECT阶段
这个阶段是投影的过程,处理SELECT子句提到的元素,产生VT5。这个步骤一般按下列顺序进行
a.计算SELECT列表中的表达式,生成VT5-1。
b.若有DISTINCT,则删除VT5-1中的重复行,生成VT5-2
c.若有TOP,则根据ORDER BY子句定义的逻辑顺序,从VT5-2中选择签名指定数量或者百分比的行,生成VT5-3
(6)ORDER BY阶段
根据ORDER BY子句中指定的列明列表,对VT5-3中的行,进行排序,生成游标VC6.
One example for the inner join and where condition
select coulumns from table_01 inner join table_02 on 01.col1=02.col2 where 01 = 'A' and 02='B' with ur ;
from the db2 plan it will Optimized Statement like below which remove the join on condition and using where replace it :
select coulumns from table_01 , table_02 where 01 = 'A' and 02='B' and 01.col1=02.col2 with ur ;
上面优化后的sql 未必是最佳的 ,有可能程序index 会用不到的 。
参考:http://www.phpddt.com/db/join-on-where.html
- 从join on和where执行顺序认识T-SQL查询处理执行顺序
- 从join on和where执行顺序认识T-SQL查询处理执行顺序
- 从join on和where执行顺序认识T-SQL查询处理执行顺序
- 从join on和where执行顺序认识T-SQL查询处理执行顺序
- sql(join on 和where的执行顺序)
- sql(join on 和where的执行顺序)
- sql(join on 和where的执行顺序)
- sql(join on 和where的执行顺序)
- sql(join on 和where的执行顺序)
- sql(join on 和where的执行顺序)
- SQL 中 join on 和 where 的执行顺序
- sql(join on 和where的执行顺序)
- sql(join on 和where的执行顺序)
- sql(join on 和where的执行顺序)
- join on where执行顺序
- join on 与 where 执行顺序
- T-SQL查询处理执行顺序
- T-SQL查询处理执行顺序
- JAVA:二进制与十进制转换
- What is a Servlet?
- 牛客网_华为机试_023_删除字符串中出现次数最少的字符
- poj 3669 bfs
- [编程题] 微信红包
- 从join on和where执行顺序认识T-SQL查询处理执行顺序
- hadoop 日志及历史服务器
- 类的动态分配内存与释放
- H264码流中SPS PPS详解
- 没事刷刷题之三 产生冠军 HDOJ 2094
- python学习笔记(五)
- 全文检索Lucene(四)---Compass框架
- 海康威视多摄像头视频实时采集——OpenCV显示
- python 函数高级特性