由于分区导致 SQL Server 中的查询执行缓慢

如何解决由于分区导致 SQL Server 中的查询执行缓慢

我在 sql Server 2012 中有以下查询

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
    

我得到以下统计输出显示 cpu 时间和运行时间显着减少:

(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 个。

一个查询的实际执行计划 XML 提取

<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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?