SQL 服务器 Table 使用不同的参数对同一 TSQL 的不同查询计划进行分区

SQL Server Table Partitioning different query plan for same TSQL with different parameter

我们正在使用 SQL Server 2012 Table 分区。每个分区包含近 500 万行,大小约为 600 GB。数据库是可用性组的一部分,我们 运行 低于可读辅助查询。

分区列:ConnectionTime - DATETIME - 1 天分区

总分区数:1065

2015 年 10 月 1 日的分区号 00:00:00.000 --> 1003

2015 年 10 月 19 日的分区号 00:00:00.000 --> 1021

SELECT COUNT(*),substring(convert(VARCHAR, ConnectionTime, 1), 1, 50) AS [Date]
FROM ReportDB.dbo.TblReport WITH (NOLOCK)
WHERE ConnectionTime BETWEEN '1-Oct-2015 00:00:00.000'
        AND '1-Oct-2015 23:59:59.997'
GROUP BY substring(convert(VARCHAR, ConnectionTime, 1), 1, 50)

SELECT COUNT(*),substring(convert(VARCHAR, ConnectionTime, 1), 1, 50) AS [Date]
FROM ReportDB.dbo.TblReport WITH (NOLOCK)
WHERE ConnectionTime BETWEEN '19-Oct-2015 00:00:00.000'
        AND '19-Oct-2015 23:59:59.997'
GROUP BY substring(convert(VARCHAR, ConnectionTime, 1), 1, 50)

在这个table上我们有一个聚集索引和一个非聚集索引。

从 2015 年 10 月 19 日开始,我们面临的问题是,针对 1-oct 的相同查询正在寻找并行执行的集群索引。当任何大于 19-oc 的查询正在寻找非聚簇索引并且不并行执行时。

当 ConnectionTime 大于 19-oct 时,它会为 tempdb 生成过多的 IO。

有人遇到同样的问题吗?任何解决方案?

集群索引的统计信息自最近 10 天以来未更新。因为它是自动更新的。一些它没有更新的原因。查询计划是根据统计信息准备的,因此它不会使用聚簇索引和分区。

重建索引和查询现在工作正常。