sql - 如果我们在 Select 查询的 where 子句中排除空行,是否有任何性能优势
问题描述
表Foo
结构:
ID – PK
SampleCol – Can have null and is not indexed
SampleCol2, SampleCol3, etc
表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'
正是您要进行的比较。因此,数据库必须以某种方式对返回的每一行进行这种比较。
基本上有两种情况。如果没有索引,您的查询需要进行全表扫描。每行的两个比较(一个针对NULL
值,一个针对值)比单个比较花费更长的时间。老实说,一些数据库可能仅针对相等比较进行优化,因此两者可能相等。我不认为 SQL Server 会消除这种情况,但它可能会。
有了索引,SQL Server 将使用索引进行=
比较。然后它可能会进行额外的比较NULL
(即使这是多余的)。但是,您在这里遇到了一个更大的问题:谓词越复杂,优化器就越有可能感到困惑并且不使用索引。
第三种情况是您的列用于分区。我不知道冗余比较是否会对分区修剪产生影响。
你希望你的where
比较简单。通常,您希望让优化器完成其工作。在极少数情况下,您可能希望为优化器提供一些帮助,但这种情况非常、非常、非常罕见——而且通常涉及的函数运行起来比简单的比较要昂贵得多。
推荐阅读
- c# - StreamWriter.Write 没有写入所有数据
- c# - 模拟数据库集
EF Core 5 中的 .FromSqlRaw - python - 没有找到 tensorflow==2.1.3 的匹配分布
- r - 折叠多行,将某些行的值保留在一个变量中,将另一行的值保留在另一个变量中
- c++ - Opencv 库有问题
- perforce - 添加没有读取权限的文件以强制执行
- python-3.x - 使用 typing.List 的语法示例?
- javascript - 刷新令牌有什么用处?
- objective-c - 当没有互联网连接时,URLSession 返回 NSURLErrorTimedOut 而不是 NSURLErrorNotConnectedToInternet iOS 14
- html - PROGMEM R中的Arduino变量“=====(HTML