回答

收藏

首先执行哪个?WHERE子句或JOIN子句

技术问答 技术问答 123 人阅读 | 0 人回复 | 2023-09-14

哪个子句在SELECT首先在句子中执行?/ c/ Q& \, E1 Y( m& W) \1 |
我对此有疑问select。
9 r  O  O! i8 |3 h2 g6 X# {  w考虑下面的例子
& R/ U1 j! S' i+ n2 M/ QSELECT * FROM #temp A INNER JOIN #temp B ON A.id = B.id INNER JOIN #temp C ON B.id = C.id WHERE A.Name = 'Acb' AND B.Name = C.Name[ol]是否,先检查WHERE然后执行子句INNER JOIN
% r' |6 U$ o9 N+ r8 Z先JOIN再检查检查条件?' b9 K! \' \$ F% P! Z
[/ol]如果先执行JOIN然后进行WHERE条件处理;不同JOINs如何在条件下执行更多操作?' V) H! i7 y9 v" M+ V: m' \/ b; z
                                                                4 N2 x; k  u* L) p6 }" D" k2 a1 [, M
    解决方案:                                                                . F0 J. Z& F9 q1 Z. b: V
                                                                查询处理的概念顺序如下:4 u& u' Z' l1 r
1. FROM2. WHERE3. GROUP BY4. HAVING5. SELECT6. ORDER BY但这只是一个概念顺序。事实上,发动机可能决定重新安排条款。这是证明。让我们做两个表,每个表有1万行:! h- I6 p7 t7 g, S) t' M3 s( S+ h
CREATE TABLE test1 (id INT IDENTITY(1,1),name VARCHAR(10))CREATE TABLE test2 (id INT IDENTITY(1,1),name VARCHAR(10));WITH cte AS(SELECT -1   ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) d FROM(VALUES(1),(1),(1),(1),(1),(1),(1)t1(n) CROSS JOIN(VALUES(1),(1),(1),(1),(1),(1),(1)t2(n) CROSS JOIN(VALUES(1),(1),(1),(1),(1),(1),(1)t3(n) CROSS JOIN(VALUES(1),(1),t4(n) CROSS JOIN(VALUES(1),(1),(1),(1),t5(n) CROSS JOIN(VALUES(1),(1),(1),(1),t6(n))INSERT INTO test1(name) SELECT 'a' FROM cte现运行两个查询:2 }) g5 F. {. v) |' a
SELECT * FROM dbo.test1 t1JOIN dbo.test2 t2 ON t2.id = t1.id AND t2.id = 100WHERE t1.id > 1SELECT * FROM dbo.test1 t1JOIN dbo.test2 t2 ON t2.id = t1.idWHERE t1.id = 1请注意,第一个查询将在join大部分行都会在条件下过滤掉,但第二个查询会在where在条件下过滤掉。
  g0 C( E$ t$ q/ C# J! D1 TableScan-谓词:[Test]。[dbo]。[test2]。[id]为[t2]。[id] =(100)' b1 U0 g- w& g3 m) N
2 TableScan-谓词:[Test]。[dbo]。[test2]。[id]为[t2]。[id] =(1)
' w$ _$ _4 \3 m$ M/ k! D0 `这意味着引擎首先决定评估优化的第一个查询join过滤出行的条件。在第二个查询中,它where首先评估这个。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则