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

Is there any performance benefit if we exclude null rows in where clause in Select query

Table Foo 结构:

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

Table Foo 有大约 100,000 多行,其中许多 SampleCol 作为 NULL.

SQL 查询 #1:

select * 
from Foo 
where SampleCol = 'Test'

SQL 查询 #2:

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

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

谢谢!

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

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

基本上有两种情况。如果没有索引,您的查询需要进行完整的 table 扫描。每行的两次比较(一次用于 NULL,一次用于值)比一次比较花费的时间更长。老实说,一些数据库可能优化这个只是为了平等比较,所以两者可能是平等的。我不认为 SQL 服务器会执行此消除,但它可能会。

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

还有第三种情况,你的列用于分区。不知道冗余比较会不会对partition p运行ing.

有影响

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