Sql-Server
DBCC CHECKTABLE 需要 15 分鐘以上才能在空表上執行
我有一個數據庫,其中一些小型或空表上的 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+)有 2000+ 分區和 163 列。幾乎所有這些都是臨時工作表,應該被應用程序刪除但沒有。我清除了它們,並且該過程返回到一個不到 1 分鐘的空表的正常響應時間。
他們還指出,文件中列出了分區會影響 DBCC 檢查。從分區表和索引:
DBCC 命令
隨著分區數量的增加,DBCC 命令的執行時間可能會隨著分區數量的增加而變長。