業務常需按多個長字符串列 (如 Name + GroupName,各 50 字符) 聯合查詢。5000 萬行表上建立復合索引,每行消耗 100+ 字節,索引體積龐大,插入/更新維護開銷大,查詢仍需字符串比對。
應用確定性 Hash 算法 (SQL Server 內置 CHECKSUM()) 將長字符串映射為 4 字節整數,構建 計算列 + 非聚集索引,查詢時先按 Hash 值精確定位候選行集,再回表驗證原始字符串。
ALTER TABLE HumanResources.Department
ADD Name_GroupName_Hash AS CHECKSUM(Name, GroupName)
CREATE INDEX IX_Department_Hash
ON HumanResources.Department (Name_GroupName_Hash)
CREATE PROCEDURE DemoHash
@Name VARCHAR(50), @GroupName VARCHAR(50)
AS
DECLARE @HashKey INT = CHECKSUM(@Name, @GroupName)
SELECT * FROM HumanResources.Department
WHERE Name_GroupName_Hash = @HashKey
AND Name = @Name
AND GroupName = @GroupName
| 指標 | 傳統復合索引 | Hash 索引方案 |
|---|---|---|
| 索引行大小 | ~100 字節 | 4 字節 (整數) |
| 索引總體積 (5000萬行) | ~5 GB+ | ~200 MB |
| 查詢邏輯讀 | 索引掃描/查找 + 字符串比對 | 索引精確查找 (極少行) + 回表驗證 |
| CPU 消耗 | 字符串比對 | 整數比對 + 單次 Hash 計算 |
| 插入/更新開銷 | 高 (長鍵值維護) | 低 (整數維護) |
CHECKSUM() 可能碰撞 → 必須回表驗證原始列