面對百萬級甚至千萬級表,查詢性能優劣全取決於「能否避開全表掃描、用上索引、減少回表」。本文匯總 28 條經驗法則,涵蓋 WHERE 條件寫法、索引設計、類型選擇、臨時表、游標、存儲過程等,每條附反面教材與正確範例,可直接作為 Code Review 清單。
WHERE/ORDER BY 列必須有索引。WHERE num IS NULL → 設置默認值 0,改 WHERE num = 0。IN/UNION ALL 或業務層過濾。num=10 OR num=20 → UNION ALL 兩條索引查詢。BETWEEN;大列表改 JOIN 衍生表或臨時表。WHERE num = @num 編譯時未知值 → 強制索引 FORCE INDEX 或應用層拼接常量。WHERE num/2 = 100 → WHERE num = 200。WHERE SUBSTRING(name,1,3)='abc' → WHERE name LIKE 'abc%';WHERE DATEDIFF(day, dt, '2024-01-01')=0 → WHERE dt >= '2024-01-01' AND dt < '2024-01-02'。INDEX(a,b,c) 必須 WHERE a=? 才能用上;WHERE b=? 無效。SELECT ... WHERE 1=0 建空表 → CREATE TABLE ... LIKE ...。WHERE num IN (SELECT num FROM b) → WHERE EXISTS (SELECT 1 FROM b WHERE num=a.num),半連接優化。INT/BIGINT/DECIMAL,字符串比較逐字符、佔空間大。DECLARE @t TABLE(...),僅主鍵索引,適合小結果集。SELECT ... FROM (SELECT ...) dt。SELECT * INTO #tmp FROM big_table 少日誌、快;小數據用 CREATE + INSERT 緩解系統表壓力。TRUNCATE #tmp; DROP TABLE #tmp; 避免長鎖系統表。DONE_IN_PROC 網絡包,減少往返。
✅ 索引列裸露、最左前綴、覆蓋索引、選擇性高
✅ 範圍查詢常量化、LIKE 只用後綴、NULL 改默認值
✅ 數字優先、VARCHAR優先、禁SELECT*、單表索引≤6
✅ 大表分批、影子表RENAME、DECIMAL存金額
✅ 集合思維、拒游標、NOCOUNT、慢查詢日誌常開
打印貼在工位,Code Review 逐條核對,百萬級查詢不再慌。