DBCC CHECKTABLE 在空表上运行需要 15 分钟以上

Rus*_*960 7 sql-server dbcc sql-server-2016 dbcc-checktable

我有一个数据库,其中 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
Run Code Online (Sandbox Code Playgroud)

Rus*_*960 6

我最终打开了与 Microsoft 的一个事件,并确定 sys.sysrscols(只能通过 DAC 访问)有超过 2 亿行。在他们进行审查后发现,作为 DBCC SQL Server 的一部分,即使是 DBCC CHECKTABLE 也始终对系统表进行检查。从DBCC CHECKTABLE 手册

始终对所有系统表索引执行完整性检查。

我的理解是 sys.sysrscols 做了一些列跟踪,大尺寸的原因是我们有许多表(200+),它们有 2,000+ 个分区和 163 个列。几乎所有这些都是应该被应用程序删除但没有删除的临时工作表。我清除了它们,并且该过程返回到不到 1 分钟的空表的正常响应时间。

他们还指出,文档中列出了分区会影响 DBCC 检查。从分区表和索引

DBCC 命令

如果分区数量较多,随着分区数量的增加,DBCC 命令的执行时间可能会更长。