今天一个同事突然告诉我,以前跑得很正常的一个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 输出了错误信息,请与系统管理员联系。