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


12

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

SELECT *
FROM MyTable
WHERE BitField = 1
    AND VarcharField = 'asdf'

并且包含该bit比较仅会排除与该varchar比较将排除的相同字段,那么该bit字段比较的存在是否会给我带来性能改进?

Answers:


22

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

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

通常,如果您的数据库设计是关系型的,您提供了良好的访问方法和准确的统计信息,并且查询编写得当,则优化器通常将找到合理的物理执行策略,而无需您过多担心的书面形式。查询规范过多。

总是存在使用不同(但语义相同)语法表示相同逻辑要求的情况,这会影响物理执行计划,但这应该是次要的问题。同样,通常,一旦涵盖了上面提到的所有基础知识,则仅考虑在运行时特征不可接受时以不同方式表示查询。

简单的连词WHERE从句谓语的书面顺序(如在问题中)很少以任何可测量的方式影响物理执行计划。简而言之,这不是您应该花时间担心的事情。首先获取数据库设计,索引和统计信息。

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

作为实现细节,不,SQL Server不会根据数据类型或明显的计算复杂性来考虑比较的成本。实际上,标量运算的成本几乎很少,但这导致了一个完整的主题。

相关问题:

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


5

二进制分区(如位列)听起来像是筛选索引的良好候选者。

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

明确说明您的优化意味着您的代码可以更健壮地应对他人的更改,无论是在您的代码库中还是在SQL Server中。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.