筆者早年從事 ASP 與 .NET 開發時頻繁使用 SQL Server,轉向 PHP 後雖以 MySQL 為主,但仍常遇到客戶需在既有 SQL Server 平台升級或相容開發的情況。所幸 PHP 對資料庫支援極廣,幾乎能連接所有主流資料庫。本文將分享正確優化 SQL Server 資料庫的實戰經驗,涵蓋操作注意事項、SQL 語句優化核心原則,助您提升資料庫效能。
預設建立為非叢集索引,但並非萬能。非叢集索引下資料在資料頁隨機分佈,合理索引設計必須建立在對查詢模式的分析與預測之上:
含 NULL 值的欄位不會被納入索引,即使為複合索引,任一列含 NULL 即導致該列排除。WHERE 子句使用 IS NULL 或 IS NOT NULL 時,優化器將放棄索引掃描,轉為全表掃描。
EXISTS 採用範圍掃描,IN 易觸發全表掃描。幾乎所有 IN 子查詢皆可改寫為 EXISTS,效能提升顯著。
大量資料查詢時,避免在 WHERE 或 JOIN 條件中對欄位做隱式/顯式轉換,導致索引失效。
預存程序僅有一個 OUTPUT 參數時,呼叫端必須給予初始值,否則拋錯。
任何索引皆有助 SELECT 效能,但索引列含 NULL 時優化器無法優化。
對欄位任何操作(函數、運算式)皆導致表掃描。查詢時應將運算移至等號右側,保持欄位「乾淨」。
常引發工作表導致索引失效。若不產生大量重複值,可拆分子句並確保各含索引欄位。
開啟 SET SHOWPLAN_ALL ON 觀察實際執行路徑,針對性調優。
遊標消耗資源大。必須使用時,先將符合條件資料導入暫表,再對暫表定義遊標操作,效能明顯改善。
SQL 優化本質是在結果正確前提下,撰寫優化器可識別的語句,充分利用索引,減少表掃描 I/O,避免表搜尋。經驗證明,最大效能提升源於邏輯資料庫設計、索引設計與查詢設計;最大效能問題亦常源於此三者缺失。深層優化更涉及資源配置、網路流控、作業系統調校等系統層面。