这不是关于:
这不是关于接受用户输入或使用变量的全面查询的问题。
这完全是关于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 如何确定查询计划的缺失索引建议中键列的顺序?
对我来说,我有一个关于 SARGability 的有趣问题。在这种情况下,它是关于对两个日期列之间的差异使用谓词。这是设置:
USE [tempdb]
SET NOCOUNT ON
IF OBJECT_ID('tempdb..#sargme') IS NOT NULL
BEGIN
DROP TABLE #sargme
END
SELECT TOP 1000
IDENTITY (BIGINT, 1,1) AS ID,
CAST(DATEADD(DAY, [m].[severity] * -1, GETDATE()) AS DATE) AS [DateCol1],
CAST(DATEADD(DAY, [m].[severity], GETDATE()) AS DATE) AS [DateCol2]
INTO #sargme
FROM sys.[messages] AS [m]
ALTER TABLE [#sargme] ADD CONSTRAINT [pk_whatever] PRIMARY KEY CLUSTERED ([ID])
CREATE NONCLUSTERED INDEX [ix_dates] ON [#sargme] ([DateCol1], [DateCol2])
Run Code Online (Sandbox Code Playgroud)
我会经常看到的是这样的:
/*definitely not sargable*/
SELECT
* ,
DATEDIFF(DAY, [s].[DateCol1], [s].[DateCol2])
FROM
[#sargme] AS [s] …Run Code Online (Sandbox Code Playgroud) 我知道我的数据库上有很多阻塞,并已尽力按供应商进行排序,因为他们支持此应用程序并且尚未产生任何成功的结果。时不时,我们会遇到阻塞问题,这种阻塞变得如此严重,而且他们的设计非常糟糕,以至于整个门户都会关闭,除非我杀死少数持有排他锁的 SPID(大部分)。
我已经使用 sp_blitzindex 近一年了,并且是 Brent Ozar 先生和团队提供的 First Responder Kit 的忠实粉丝。当我对这个发生阻塞的数据库执行 sp_blitzindex 时,它说 - “积极的索引不足:总锁定等待时间 > 5 分钟(行 + 页),平均等待时间长”,优先级为 10。我检查了URL列并还检查了其他相关页面,但无法获得太多帮助。
我知道此处列出的表已编入索引,并且需要创建更多索引,但是当我使用以下命令在表级别为这些对象分别运行相同的过程即 sp_blitzindex 时:
EXEC dbo.sp_BlitzIndex @DatabaseName='db1', @SchemaName='sch', @TableName='tab1';
Run Code Online (Sandbox Code Playgroud)
我根本没有得到任何丢失的索引详细信息。所有现有索引都被利用并且读取计数小于写入计数,只有这里突出显示的问题在主键的“锁定等待”列中。
我不知道需要创建哪个列索引。我还检查了 sp_blitzlock 以查看是否可以收集更多信息,这会有所帮助,但是我看到有很多死锁并且列出了相同的对象,这些对象在积极索引不足中被计算出来。
还通过在此特定数据库中将排序顺序作为“读取”和“持续时间”传递来检查 sp_blitzcache 的输出,但没有丢失索引请求。有警告说“未参数化查询”和“未参数化查询,非 SARGables”,这些计划涉及不同的表集。
任何帮助都受到高度赞赏。
Version: Microsoft SQL Server 2014 (SP3) (KB4022619) - 12.0.6024.0 (X64) Sep 7 2018 01:37:51 Enterprise Edition: Core-based Licensing (64-bit) on Windows NT 6.3 (Build 9600: ) (Hypervisor)
Run Code Online (Sandbox Code Playgroud)