今天一個同事突然告訴我,以前跑得很正常的一個SQL語句,執行時突然報如下錯誤:
消息1222,級別16,狀態18,第1 行
已超過了鎖請求超時時段。
消息8630,級別16,狀態1,第1 行
內部查詢處理器錯誤: 查詢處理器在執行過程中遇到意外錯誤。
我執行了一下這個SQL語句,也是報如上錯誤,感覺有點奇怪,還是第一次遇到這種錯誤。我初步懷疑是SQL中某個表出現一致性錯誤或分配錯誤等原因造成。於是先用DBCC CHECKTABLE 依次檢查每個表。DBCC CHECKTABLE用來檢查組成表或索引視圖的所有頁和結構的完整性。結果還真的發現其中一個表有2個一致性錯誤。如下所示:
pbFabricWIP的 DBCC 結果。
消息 8951,級別 16,狀態 1,第 1 行
表錯誤: 表 'pbFabricWIP' (ID 1254295528)。數據行在索引 'Current_Index' (ID 24)中沒有匹配的索引行。與以下數據行匹配的索引行的鍵可能丟失或無效:
消息 8955,級別 16,狀態 1,第 1 行
數據行(1:31937:26)由(HEAP RID = (1:31937:26))標識,索引值為 'Current_Department = 'FI' and Current_Operation = '待裝單' and HEAP RID = (1:31937:26)'。
消息 8952,級別 16,狀態 1,第 1 行
表錯誤: 表 'pbFabricWIP' (ID 1254295528)。索引 'Current_Index' (ID 24)中的索引行與任何數據行都不匹配。可能是以下行的多余或無效的鍵:
消息 8956,級別 16,狀態 1,第 1 行
索引行(1:10613:16)的值為(Current_Department = 'FI' and Current_Operation = '待組板' and HEAP RID = (1:31937:26)),指向由(HEAP RID = (1:31937:26))標識的數據行。
對象 'pbFabricWIP' 的 7391 頁中有 324059 行。
CHECKTABLE 在表 'pbFabricWIP' (對象 ID 1254295528)中發現 0 個分配錯誤和 2 個一致性錯誤。
對於由 DBCC CHECKTABLE (SystemDB.dbo.pbFabricWIP)發現的錯誤,repair_rebuild 是最低的修復級別。
DBCC 執行完畢。如果 DBCC 輸出了錯誤信息,請與系統管理員聯系。
於是接下來需要修復這個表的索引的一致性錯誤。使用DBCC DBREINDEX執行后,問題解決。
DBCC DBREINDEX('pbFabricWIP')
DBCC 執行完畢。如果 DBCC 輸出了錯誤信息,請與系統管理員聯系。