我有一个数据库,其中 DBCC CHECKTABLE 在许多小表或空表上运行需要超过 15 分钟。当它完成时,没有失败或错误。服务器上其他一切的性能都处于非常可接受的形式。没有其他东西同时运行。
我还尝试了 DBCC CLEANTABLE 并使用全扫描更新了统计信息。
我使用的是 SQL Server 2016 企业版 (13.0.5201.2)
示例表:
CREATE TABLE [Schema1].[Table1](
[col1] [int] NOT NULL,
[col2] [nvarchar](100) NOT NULL,
[col3] [xml] NOT NULL,
CONSTRAINT [PK_1] PRIMARY KEY CLUSTERED
(
[col1] ASC,
[col2] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
我最终与 Microsoft 发生了一起事件,确定 sys.sysrscols(只能通过 DAC 访问)有超过 2 亿行。在他们进行审查后发现,作为 DBCC 的一部分,SQL Server 始终对系统表进行检查,即使是 DBCC CHECKTABLE。来自DBCC CHECKTABLE 手册:
我的理解是 sys.sysrscols 进行了一些列跟踪,而大尺寸的原因是我们拥有的许多表(200+)具有 2,000+ 分区和 163 列。几乎所有这些都是临时工作表,应用程序应该删除但没有删除。我清除了它们,并且该过程返回到不到 1 分钟的空表的正常响应时间。
他们还注意到文档中列出了分区会影响 DBCC 检查的信息。从分区表和索引: