在 SQL Server 2000 (Enterprise 與 Personal 版) 中,當資料表擁有單欄位降序叢集索引時,執行帶有範圍條件的 UPDATE 或 DELETE 陳述式會導致資料異常:
-- 建立降序叢集索引表
CREATE TABLE AType (
AID INT NOT NULL,
Name VARCHAR(20) NOT NULL,
CONSTRAINT PK_DateType PRIMARY KEY CLUSTERED (AID DESC)
);
-- 插入測試資料
INSERT INTO AType VALUES (1, 'a'), (50, 'b'), (100, 'c');
-- 執行刪除
DELETE FROM AType WHERE AID < 50;
-- 再次查詢,預期無資料,實際仍回傳 AID=1 的列
SELECT * FROM AType WHERE AID < 50; -- 錯誤:仍有記錄輸出
PRIMARY KEY CLUSTERED (AID ASC),效能相同且避開 Bug。ORDER BY AID DESC 處理排序,不在索引定義指定 DESC。「單欄位無需建立降序索引,因為 SQL Server 可在適當時反向掃描升序索引。降序索引通常僅用於複合索引中。」
— Microsoft 官方文件說明
DBCC SHOWCONTIG 檢查索引碎片,必要時重建索引。