首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL 效能調優三大黃金法則:索引、聯結、WHERE 條件

     編輯:關於SqlServer

法則一:合理的索引設計

實測環境: 62 萬筆 record 表

索引策略范圍查詢GROUP BYIN 查詢
date 非叢集25 秒55 秒27 秒
date 叢集14 秒28 秒14 秒
(place, date, amount) 複合26 秒27 秒<1 秒
(date, place, amount) 複合<1 秒11 秒<1 秒

索引設計原則

  1. 大量重複值 + 范圍查詢 + ORDER BY/GROUP BY → 叢集索引
  2. 多欄位常同時存取且皆有重複值 → 複合索引
  3. 複合索引前導欄必須為最高頻查詢欄位,爭取索引覆蓋

法則二:充分的聯結條件

場景: card (7,896 筆) ↔ account (191,122 筆)

-- 僅聯結 card_no:20 秒
SELECT SUM(a.amount) FROM account a, card b 
WHERE a.card_no = b.card_no

-- 加上 account_no:<1 秒
SELECT SUM(a.amount) FROM account a, card b 
WHERE a.card_no = b.card_no AND a.account_no = b.account_no

原理分析

優化器根據聯結條件選擇外部/內部表。充分條件讓優化器選到最小 I/O 成本路徑(外部表匹配行數 × 內部表查找成本)。

查看執行計畫:SET SHOWPLAN_ON 或 DBCC TRACEON(3604, 310, 302) (需 sa)。

法則三:可優化的 WHERE 條件

避免對欄位做運算(導致掃表)

慢查詢快查詢 (索引生效)
SUBSTRING(card_no,1,4)='5378' (13秒)card_no LIKE '5378%' (<1秒)
amount/30 < 1000 (11秒)amount < 30000 (<1秒)
CONVERT(char(10),date,112)='19991201' (10秒)date = '1999/12/01' (<1秒)

原則: 將運算移至等號右邊,讓優化器在編譯期即可計算常數。

IN / OR 導致工作表與索引失效

-- 慢:IN 轉為 OR 策略,建工作表、不走索引
SELECT COUNT(*) FROM stuff WHERE id_no IN ('0','1') -- 23秒 (62萬筆達 220秒)

-- 快:拆分查詢再加總
SELECT COUNT(*) FROM stuff WHERE id_no='0'  -- 3秒
SELECT COUNT(*) FROM stuff WHERE id_no='1'  -- 3秒
-- 或用預存程序變數累加

總結

SQL 調優本質:寫出優化器可識別的語句 → 充分利用索引 → 減少 I/O → 避免掃表。應用層調優只是冰山一角,深層還涉及資源配置、網路、作業系統調校。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved