WHERE 查询会在运行更艰巨的比较(即 varchar)之前检查更简单的比较(即位)吗?

and*_*ewb 12 sql-server optimization

如果我编写一个包含复合WHERE子句的查询,例如:

SELECT *
FROM MyTable
WHERE BitField = 1
    AND VarcharField = 'asdf'
Run Code Online (Sandbox Code Playgroud)

并且包含该bit比较只是排除了varchar比较将排除的相同字段,该bit字段比较的存在是否会使我的性能有所提高?

Pau*_*ite 22

认识到 SQL 是一种声明性语言很重要。SELECT您编写的查询指定了应返回的逻辑结果。由数据库引擎(特别是查询优化器)来确定返回这些结果的有效物理策略。

最终的物理执行计划将取决于优化器的推理能力、准备在问题上花费的时间、合适的访问方法(主要是索引和物化视图)的可用性、代表性的统计信息以及您的特定代码路径。查询规范通过优化代码。

一般来说,如果你的数据库设计是关系型的,你提供了良好的访问方法和准确的统计信息,并且查询写得很好,优化器通常会找到合理的物理执行策略,而无需过多担心查询规范太多。

总会有使用不同(但语义相同)语法表达相同逻辑需求的情况会影响物理执行计划,但这应该是次要问题。同样,通常,只有在涵盖了上述所有基础知识后,如果运行时特征不可接受,才考虑以不同方式表达查询。

在极端情况下,简单连接WHERE从句谓词(如问题中)的书面顺序以任何可衡量的方式影响物理执行计划是罕见的。简而言之,这不是您应该花时间担心的事情。首先获得正确的数据库设计、索引和统计信息。

要直接(最终!)回答这个问题,添加额外的冗余条件可能会提高性能,但前提是它可以使用更有效的访问方法 - 例如,如果 (BitField, VarcharField) 上只有一个索引。如果 (VarcharField) 上已经有一个索引,它只会增加开销。

作为实现细节,不,SQL Server 不考虑根据数据类型或明显的计算复杂性进行比较的成本。事实上,标量操作的成本几乎没有,但这导致了一个完全独立的主题。

相关问题:

WHERE
SQL Server 2008中的条件和条件顺序中的逻辑运算符 OR AND和常量表达式
影响性能的位运算符
奇怪的 SQL 语句行为


Gre*_*reg 5

二进制分区(如位列)听起来很适合过滤索引。

CREATE NONCLUSTERED INDEX MyTableWithBitFieldTrue
ON MyTable (VarcharField)
INCLUDE Id, <other columns you're selecting>
WHERE BitField = 1 ;
GO
Run Code Online (Sandbox Code Playgroud)

明确您的优化意味着您的代码在其他人的更改下更加健壮,无论是在您的代码库中还是在 SQL Server 中。