DBCC CheckTable 发现两个损坏的索引

Aus*_*hin 7 sql-server

我想知道这个问题是否可以通过删除/重新创建两个索引来解决。两者都很少使用,非聚集,非 PK,非 FK 索引。

这是 dbcc 输出:

表错误:表“项目”(ID 1954106002)。数据行在索引“IX_Advertise_BrandCopy_Price_Stock”(ID 69)中没有匹配的索引行。索引行匹配可能缺少或无效的键:

消息 8955,级别 16,状态 1,第 1 行

数据行 (1:11226494:9) 由 (Id = 11078215) 标识,索引值为“AdvertiseFlag = 1 且 BrandCopyParentId = 0 且 NSFPPrice = 137.50 且 NSFPQtyInStock = 0 且 Id = 11078215”。

消息 8951,级别 16,状态 1,第 1 行

表错误:表“项目”(ID 1954106002)。数据行在索引“IX_ITEMS_ADVFLAG_PARETN_PRICE_STOCK”(ID 70)中没有匹配的索引行。索引行匹配可能缺少或无效的键:

消息 8955,级别 16,状态 1,第 1 行

数据行 (1:10834009:15) 由 (Id = 8885719) 标识,索引值为“AdvertiseFlag = 1 且 BrandCopyParentId = 0 且 NSFPPrice = 9.30 且 NSFPQtyInStock = 0 且 Id = 8885719”。

Rem*_*anu 5

非聚集索引总是可以从基表重新创建。无需删除它们,只需重建m:

alter index IX_Advertise_BrandCopy_Price_Stock on BrandCopy rebuild;
Run Code Online (Sandbox Code Playgroud)

当然,您必须弄清楚它们最终是如何损坏的。Windows 是否报告 IO 错误?您的驱动器固件是否报告错误?您需要调查以找出导致损坏的原因并消除问题(可能有故障的硬件、磁盘或内存)。

  • 在我的(公认有限的)损坏经验中,我总是不得不删除和重新创建非聚集索引,因为重建计划使用索引扫描(损坏的索引),因为它比扫描基表便宜 - 损坏总是每次我试过这个时都会留下来。 (2认同)
  • @JonSeigel:是的,你是对的。重建将使用与源相同的索引并将保留损坏,因为这是一个交叉键问题。Aushin,试着放下并创造…… (2认同)