群內討論:DELETE FROM course WHERE classID = 500001,classID 無索引。為提升刪除效率,建立非聚集索引是否有效?
-- 表 A:classID 有非聚集索引
CREATE TABLE course (
ID INT IDENTITY(1,1) PRIMARY KEY CLUSTERED,
sCourseName NCHAR(10),
classID INT
);
CREATE INDEX IX_classID ON course(classID);
-- 表 B:無任何索引(除主鍵)
CREATE TABLE course2 (
ID INT IDENTITY(1,1) PRIMARY KEY CLUSTERED,
sCourseName NCHAR(10),
classID INT
);
各插入 1000 行,執行:
DELETE FROM course WHERE classID = 500;
DELETE FROM course2 WHERE classID = 500;
CREATE INDEX IX_classID_Cover ON course(classID) INCLUDE (ID) 使刪除僅需索引操作。WHERE classID IS NOT NULL。TOP (5000))+ 索引,減少鎖升級與日誌膨脹。Index Seek vs Clustered Index Scan、Estimated Rows、Key Lookup 開銷。若 classID 本身就是聚集索引鍵,刪除將直接定位數據頁,效率最高。但聚集索引選擇需綜合考慮範圍查詢、排序、碎片等因素,不可單為單一 DELETE 優化而定。