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 语句行为
二进制分区(如位列)听起来很适合过滤索引。
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 中。