首页 > 解决方案 > 如果我们在 Select 查询的 where 子句中排除空行,​​是否有任何性能优势

问题描述

Foo结构:

ID – PK
SampleCol – Can have null and is not indexed
SampleCol2, SampleCol3, etc

Foo有大约 100,000 多行,其中许多SampleColNULL.

SQL 查询 #1:

select * 
from Foo 
where SampleCol = 'Test'

SQL 查询 #2:

select * 
from Foo 
where SampleCol is not null and SampleCol = 'Test'

查询 #2 是否比查询 #1 有任何性能优势?或者关于如何提高这些 SQL 查询的性能的任何建议?

谢谢!

标签: sqlsql-servertsqldatabase-performance

解决方案


不,它无济于事——尽管它可能会使事情稍微(可能无法衡量)变得更糟。

条件SampleCol = 'Test'正是您要进行的比较。因此,数据库必须以某种方式对返回的每一行进行这种比较。

基本上有两种情况。如果没有索引,您的查询需要进行全表扫描。每行的两个比较(一个针对NULL值,一个针对值)比单个比较花费更长的时间。老实说,一些数据库可能仅针对相等比较进行优化,因此两者可能相等。我不认为 SQL Server 会消除这种情况,但它可能会。

有了索引,SQL Server 将使用索引进行=比较。然后它可能会进行额外的比较NULL(即使这是多余的)。但是,您在这里遇到了一个更大的问题:谓词越复杂,优化器就越有可能感到困惑并且不使用索引。

第三种情况是您的列用于分区。我不知道冗余比较是否会对分区修剪产生影响。

你希望你的where比较简单。通常,您希望让优化器完成其工作。在极少数情况下,您可能希望为优化器提供一些帮助,但这种情况非常、非常、非常罕见——而且通常涉及的函数运行起来比简单的比较要昂贵得多。


推荐阅读