数据库:SQL Server 12.0.5207
除了过滤条件之一的值外,我有几个查询在所有方面都完全相同。同一张表(不是另一台服务器上的模式副本),因此索引、资源等都是相同的。一切都是完全相同的。
此查询在一秒钟内运行:
SELECT
MAX(MessageID) AS [MaxID]
FROM BoothComm.UniversalMessageQueue
WHERE
MessagePlatform = 'linux'
Run Code Online (Sandbox Code Playgroud)
此查询在一秒钟内运行:
SELECT
MAX(MessageID) AS [MaxID]
FROM BoothComm.UniversalMessageQueue
WHERE
MessagePlatform = 'linux'
AND
MessageCategory = 'accounting'
Run Code Online (Sandbox Code Playgroud)
此查询在一秒钟内运行:
SELECT
MAX(MessageID) AS [MaxID]
FROM BoothComm.UniversalMessageQueue
WHERE
MessagePlatform = 'windows'
Run Code Online (Sandbox Code Playgroud)
那么为什么这个运行需要将近 30 秒呢?
SELECT
MAX(MessageID) AS [MaxID]
FROM BoothComm.UniversalMessageQueue
WHERE
MessagePlatform = 'windows'
AND
MessageCategory = 'accounting'
Run Code Online (Sandbox Code Playgroud)
我的一个同事在表中添加了另一个索引,解决了延迟的业务问题。该索引将 30 秒减少到 FULL 秒,同时将其他查询加速到瞬时。同样,执行计划完全相同:
(索引扫描应为 100%)。我听取了其他论坛的建议,并确保查询中的列顺序与它们存储在索引中的顺序相匹配...
CREATE NONCLUSTERED INDEX [MessageID and Platform and Category] ON [BoothComm].[UniversalMessageQueue]
( …
Run Code Online (Sandbox Code Playgroud)