在投入優化工作前,必須先精準診斷病因。以下是導致 SQL Server 查詢效能低落的十大常見原因:
sp_lock、sp_who 觀察活躍使用者與鎖狀態。將資料檔、日誌檔、索引檔分別置於不同的 I/O 裝置(如獨立磁碟陣列),可顯著提升讀寫並行度。歷史經驗建議將 Tempdb 放置於 RAID 0(註:SQL Server 2000 後不再支援),資料量越大,I/O 架構設計越關鍵。
採用縱向(欄位拆分)與橫向(資料分區)分割,縮減單表體積。可使用 sp_spaceuse 監控空間使用情況,制定分割策略。
擴充記憶體、增加 CPU 核心、升級存儲設備是最直接但成本最高的手段。Windows 2000 / SQL Server 2000 支援 4-8GB 實體記憶體,虛擬記憶體建議設為實體記憶體 1.5 倍;若啟用全文檢索,建議調整至 3 倍。max server memory 設定為虛擬記憶體的一半(即實體記憶體 1.5 倍)較為適宜。
增加 CPU 核心可啟用平行查詢(排序、聯接、掃描、GROUP BY),但平行處理消耗更多記憶體與協調成本。SQL Server 會依負載自動決定平行度。注意:UPDATE/INSERT/DELETE 等修改操作不支援平行執行。
INT 優於 CHAR(20))。LIKE 'a%' 可用索引;LIKE '%a' 或 LIKE '%a%' 會掃描全表。DB Server 與 Application Server 物理分離;OLTP(線上交易)與 OLAP(分析處理)資料庫分離,避免資源互搶。
透過水平分區表 + 分散式分區檢視,構建「資料庫伺服器聯盟」。每個成員伺服器僅存儲一部分資料,但應用端透過同名檢視即可透明存取全量資料,實現大型多層 Web 站點的線性擴展。實施步驟:
DBCC REINDEX、DBCC INDEXDEFRAG 消除碎片。DBCC SHRINKDB/SHRINKFILE,大型資料庫嚴禁啟用自動增長,應預先規劃空間,避免執行期擴展造成效能抖動。ROLLBACK 回滾所有交易;COMMIT 提交當前交易。BEGIN TRAN EXEC(@sql) COMMIT TRAN查詢務必加上 WHERE 條件限制回傳列數,避免全表掃描。大表掃描期間會鎖定資源,阻塞其他聯接存取,後果嚴重。同時避免 SELECT *,僅選取必要欄位,減輕 I/O 與網路負擔。
資料儲存採 8KB 頁面(8060 字節可用),8 頁為 1 區間,採 B-Tree 結構組織。
SQL 註釋(-- 或 /* */)僅在編譯階段解析,對執行效能零影響,放心使用以提升可維護性。