如何解决由于分区导致 SQL Server 中的查询执行缓慢
SELECT
Code,ReferenceKey,CodeKey
FROM dbo.Codes
WHERE
PartitionKey = 'PART1'
AND CurrentPosition = 1
AND Deleted = 0
AND Code = 'CODE1'
AND ReferenceKey = 0x0000000000000000000000000000000000000000
sql Server parse and compile time:
cpu time = 0 ms,elapsed time = 0 ms.
(1 row(s) affected)
Table 'Codes'. Scan count 239,logical reads 10,physical reads 0,read-ahead reads 0,lob logical reads 0,lob physical reads 0,lob read-ahead reads 0.
(1 row(s) affected)
sql Server Execution Times:
cpu time = 31 ms,elapsed time = 35 ms.
实际执行计划显示了针对定义为的索引的单个索引查找:
CREATE NONCLUSTERED INDEX [idx_Codes] ON [dbo].[Codes]
(
[PartitionKey] ASC,[Code] ASC,[ReferenceKey] ASC,[CurrentPosition] ASC,[Deleted] ASC
)
INCLUDE ([CodeKey]) WITH (PAD_INDEX = OFF,STATISTICS_norECOmpuTE = OFF,SORT_IN_TEMPDB = OFF,DROP_EXISTING = OFF,ONLINE = OFF,ALLOW_ROW_LOCKS = ON,ALLOW_PAGE_LOCKS = ON)
如果我将查询改写为:
SELECT
Code,CodeKey
FROM
(
SELECT
Code,CodeKey
FROM dbo.Codes
WHERE
PartitionKey = 'PART1'
AND CurrentPosition = 1
AND Deleted = 0
AND Code = 'CODE1'
AND ReferenceKey = 0x0000000000000000000000000000000000000000
) Q
(1 row(s) affected)
Table 'Codes'. Scan count 1,logical reads 3,lob read-ahead reads 0.
(1 row(s) affected)
sql Server Execution Times:
cpu time = 0 ms,elapsed time = 1 ms.
执行计划是相同的,除了后者包括更精细的 Seek Predicate,这似乎意味着查询仅针对 239 个分区中的 1 个。
<RunTimePartitionSummary>
<PartitionsAccessed PartitionCount="239">
<PartitionRange Start="1" End="239" />
</PartitionsAccessed>
</RunTimePartitionSummary>
对于第二个查询:
<RunTimePartitionSummary>
<PartitionsAccessed PartitionCount="1">
<PartitionRange Start="14" End="14" />
</PartitionsAccessed>
</RunTimePartitionSummary>
分区键仅基于列 PartitionKey
。
为什么查询优化器对这些查询的解释如此不同(特别是在它们的执行方式方面)?
此外,目前,239 个分区中只有 2 或 3 个分区中有任何数据,所以我想知道是什么原因导致这两个查询之间的性能存在显着差异?
另外要补充的是,在重新启动 sql Server 服务后,这个问题似乎可以自行解决,执行时间都下降到 0-2 毫秒,但是,执行计划/Seek Predicates 的变化仍然是一样。
粘贴计划链接
第一个查询:https://www.brentozar.com/pastetheplan/?id=HyfFHXeJF
sql Server 服务重启后的第一次查询:https://www.brentozar.com/pastetheplan/?id=BkWk-EeyY
(重新启动后第一次查询要快得多,实际执行计划的唯一区别是StmtSimple
节点的StatementCompId
属性值已从2更改为0。)
第二个查询:https://www.brentozar.com/pastetheplan/?id=HkIeEQlyK
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。