在 SQL Server 和基于实体框架的 PMS 应用程序中,我们有一个存储过帐数据的表(用于发票)。此表中的一列如下:
[PostingDate] [datetime] NOT NULL
Run Code Online (Sandbox Code Playgroud)
它没有触发器或约束或其他任何东西,除了一个非常简单地创建的索引,如下所示:
CREATE NONCLUSTERED INDEX PostingDateIndex
ON dbo.Posting(PostingDate)
Run Code Online (Sandbox Code Playgroud)
出于某种原因,针对该索引的随机查询变得缓慢,大约每月两次,而应用程序的服务器是 24/7 全天候在线(甚至不会重新启动)并且 - 作为 PMS - 日夜频繁使用。
DBCC CHECKTABLE('dbo.Posting')
Run Code Online (Sandbox Code Playgroud)
当查询变慢时不会发现任何错误。唯一的症状是严重依赖此 PostingDate 列过滤行的查询开始变得非常缓慢,它们通常会超出我们查询的 10 分钟超时时间(当索引正常时,它们需要不到 30 秒的时间来完成)。
dbo.Posting 表本身仍然有用,您可以插入和编辑行,也可以进行简单的选择,无论您想要什么,但是当您启动严重依赖 PostingDate 的查询时,它们只会无限运行。
数据库有十多个其他索引(其中一个位于同一张表的另一个 int 类型列上),但没有一个遇到此问题。此外,该问题在 SQL Server 2014 和 SQL Server 2016 中随机出现。
要修复它,我们要做的就是右键单击 Management Studio 中的索引并选择Rebuild。完成后,一切都会再次快速运行……但是,问题会随机出现,并且在生产环境中,某些查询在我们手动重建索引之前就会消失,这在生产环境中是不可接受的。
我完全不知道是什么导致了这个问题,以及为什么只有这个特定的索引受到影响。有人能指出我正确的方向吗?我什至如何找到导致它的原因?
小智 5
我不认为这种腐败。在我看来,过时的统计数据会导致糟糕的执行计划。当您重建索引时,统计信息会被隐式更新,这暂时解决了您的问题,但不是您认为的原因。您应该有更新统计信息(和重新组织/重建索引)的策略。
| 归档时间: |
|
| 查看次数: |
95 次 |
| 最近记录: |