一、邏輯資料庫與資料表設計
正規化優勢
- 窄資料表 → 排序、建立索引更快。
- 多資料表 → 更多叢集索引機會。
- 索引更緊湊、層級更少 → I/O 減少。
- 每張表索引較少 → INSERT/UPDATE/DELETE 開銷降低。
- 減少空值與冗餘 → 儲存緊湊。
權衡
過度正規化會增加 JOIN 複雜度與查詢成本,需在「正規化」與「反正規化」間依存取模式取捨。
主鍵/外來鍵定義原則
- 連接欄位資料型別必須完全一致 (含長度、精度、定序)。
- 優先使用整數代碼鍵 (IDENTITY/SEQUENCE) 而非字串鍵。
二、索引設計核心原則
避免掃表
檢查 WHERE、JOIN ON、ORDER BY 欄位,建立對應索引。
單欄 vs 複合索引選擇
- 單欄索引或複合索引首欄為查詢欄位 → 可用。
- 查詢欄位為複合索引非首欄 → 不可用 (除非含覆蓋索引)。
窄索引優於寬索引
每頁容納更多索引鍵值 → 樹高更低 → 搜尋更快。
選擇性
SELECT COUNT(DISTINCT Col) / COUNT(*) * 100.0 AS Selectivity FROM Table;
- > 90% : 非叢集索引極佳。
- 10%-90% : 視查詢佔比決定。
- < 10% : 考慮叢集索引或全表掃描更划算。
叢集 vs 非叢集選擇指南
- 範圍查詢、頻繁排序、分組、外來鍵查找 → 叢集索引。
- 高選擇性點查詢、覆蓋索引 → 非叢集索引。
- 每張表最多一個叢集索引,慎重選擇。
三、查詢優化實務
- 善用
SET STATISTICS IO/TIME ON 分析邏輯讀/CPU。
- 檢視執行計畫:尋找 Table Scan、Key Lookup、Missing Index 提示。
- 參數化查詢 (預存程序、
sp_executesql) 重用計畫,防止注入。
- 避免隱含轉換:
WHERE Col = 123 (Col 為 VARCHAR) → 索引失效。
- 大量刪除/更新分批次 (每批 1000-5000 列) 減少鎖升級與記錄爆增。
總結
扎實的邏輯模型、精準的索引策略、持續的查詢計畫審視,構成 SQL Server 高效能的鐵三角。