【发布时间】:2020-03-08 17:39:01
【问题描述】:
当我编写代码时,我喜欢确保我正在优化性能。我假设这包括对过滤器进行排序,使重型减速器(过滤掉很多行)在顶部,而较轻的减速器(过滤掉几行)在底部。
但是当我的过滤器出现错误时,我注意到 SQL Server 首先捕获底部过滤器中的错误,然后捕获顶部过滤器中的错误。这是否意味着 SQL Server 自下而上处理过滤器?
例如(为了清楚起见,我是过滤器 - 故意输入错误 - 在 WHERE 子句而不是 JOIN 子句中):
select
l.Loan_Number
,l.Owner_First_Name
,l.Owner_Last_Name
,l.Street
,l.City
,l.State
,p.Balance
,p.Delinquency_Bucket
,p.Next_Due_Date
from
Location l
join Payments p on l.Account_Number = p.Account_Number
where
l.OOOOOwner_Last_Name = 'Kostoryz' -- I assume this would reduce the most, so I put it first
and p.DDDDelinquency = '90+' -- I assume this would reduce second most, so I put it second
and l.SSSState <> 'WY' -- I assume this would reduce the least, so I put it last
然而,SQL Server 将返回的第一个错误将是 ERROR - THERE IS NO COLUMN SSSState IN Location TABLE
它将返回的下一个错误将是错误 - 付款表中没有列 DDDDelinquency
这是否意味着 State 过滤器将在 Delinquency 过滤器之前应用,而 Delinquency 过滤器将在 Last_Name 过滤器之前应用?
【问题讨论】:
-
查询将被编译,引擎将确定执行 where 子句条件的顺序以及要使用的索引。顺序无关紧要
-
过滤器按照查询引擎认为将提供最快结果的顺序应用。使用 CTRL-L 查看估计的查询计划,该计划将在应用过滤器时向您显示。请注意,查询计划可以从执行更改为执行。您编写它们的实际顺序几乎没有区别。
标签: sql sql-server tsql filter