SQL Server不影响WHERE子句中表达式的优先级。 根据运算符的优先顺序进行运算,相同优先顺序的运算符两侧的公式根据评价的成本多寡进行运算,先运算成本小的,然后运算成本大的。
如果主题(或主题所在的项目)对性能敏感,则Sql Server优化程序可以通过优化查询策略(如索引)来“引导”成本较低的表达式和后面的表达式。
“并行操作”概念
SQL支持这一概念。 也就是说,在集成逻辑查询处理阶段出现的所有表达式都是同时计算的。 此块介绍SELECT和WHERE子句。
SELECT子句
下面的代码是错误的。
选择
订单id
yar (订单) as订单year,
orderyear 1 AS nextyear
FROM [DemoDb].dbo.[Orders]
这是因为SELECT子句中的所有列名在逻辑上没有优先级,所以所有表达式都在同一时间执行
WHERE子句
从这里开始,是回答这个回信最前面的话的问题。 关于WHERE子句,我们先来看看这样的例子。
选择col2,col2
FROM [DemoDb].dbo.[T1]
WHERE col1 0 AND col2/col1 2
假设主题想查找col2/col1值大于2的所有col1和col2小故事,但担心除数为零时发生错误,所以在前面添加了col1 0。 问题是,这是否有用。
如果我们的数据库足够机智,按照“短路评价”的原则执行,在将col1设为0时不判断col2/col1 2,似乎就没错了……
不能忘记多功能操作这一概念。 这个概念写在ANSI SQL里。 因此,微软ANSI SQL实现(Microsoft SQL Server )可以按任意顺序处理WHERE子句中的表达式。 (这包括自由支持"短路评估"。 这个选择“偏好”的唯一依据是性能,即成本。 这意味着首先计算成本较低的公式,然后计算成本较高的公式。 如果SQL Server决定先计算表达式col2/col1 2,则除数为零可能会导致错误,查询可能会失败。
总结
楼主不需要在意WHERE子句中表达式的优先级是否会影响查询性能。 优化程序根据运算符的优先级和评估的性能成本,根据评估自动优先进行计算。
楼主可以尝试通过编制索引来减少对IO的需求来提高性能。 同时决定性能的因素很多,包括你的表的设计、硬件、网络等,更具体的信息建议楼主读《Microsoft SQL Server 2008 技术内幕:T-SQL 查询》,系统地了解性能的相关信息。