这不是关于:
这不是关于接受用户输入或使用变量的全面查询的问题。
这完全是关于ISNULL()
在WHERE
子句中使用where用NULL
金丝雀值替换值以与谓词进行比较的查询,以及在 SQL Server中将这些查询重写为SARGable 的不同方法。
你为什么不在那边坐?
我们的示例查询针对 SQL Server 2016 上 Stack Overflow 数据库的本地副本,并查找NULL
年龄或年龄 < 18 岁的用户。
SELECT COUNT(*)
FROM dbo.Users AS u
WHERE ISNULL(u.Age, 17) < 18;
Run Code Online (Sandbox Code Playgroud)
查询计划显示了一个非常周到的非聚集索引的扫描。
scan 操作符显示(由于 SQL Server 的最新版本中对实际执行计划 XML 的补充)我们读取了每一行。
总的来说,我们进行了 9157 次读取并使用了大约半秒的 CPU 时间:
Table 'Users'. Scan count 1, logical reads 9157, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, …
Run Code Online (Sandbox Code Playgroud) SQL Server 2012 和 2016 标准:
如果我将if-else
逻辑放在存储过程中以执行代码的两个分支之一,取决于参数的值,引擎是否缓存最新版本?
如果在接下来的执行中,参数的值发生了变化,它是否会重新编译并重新缓存存储过程,因为必须执行代码的不同分支?(此查询的编译成本非常高。)