SQL Server **查詢分析優化器** 會自動根據 WHERE 子句決定索引使用順序,**WHERE a=1 AND b>100 與 WHERE b>100 AND a=1 效能相同**。但寫法不當會導致優化器「看不懂」,失去索引優勢。
欄位名 運算子 <常數/變數>
<常數/變數> 運算子 欄位名
欄位名 運算子 <常數/變數> AND 欄位名 運算子 <常數/變數> ...
**不滿足 SARG 形式 → 索引失效 → 全表掃描。**
name LIKE '張%' ✅ SARG;name LIKE '%張' ❌ 導掃 (前置萬用字元)。a=1 OR b>100 ❌。改用 UNION ALL (去重用 UNION)。NOT, !=, <>, !<, !>, NOT EXISTS, NOT IN, NOT LIKE, 函數包裹欄位 (ABS(price)<5000) ❌。WHERE price*2 > 5000 優化器可轉為 price > 2500 ✅,但**不建議依賴隱式轉換**。tid IN (2,3) ❌ 全表掃描,索引失效。pubs 庫,STATISTICS IO 邏輯讀、掃描次數**完全一致**。NOT EXISTS vs NOT IN 亦同。選可讀性較佳者。COUNT(*) 1.5s、COUNT(PK) 1.48s、**COUNT(*) 最快** (優化器自動選最小欄位統計)。長字串欄位 COUNT(title) 52s 極慢。TOP 10 僅回傳 10 列 → **物理 I/O 決定回應時間**,TOP 大幅減少網路傳輸與客戶端渲染。Oracle 無 TOP 需用 ROWNUM。網卡、交換機、儲存子系統、CPU 核心數、記憶體頻寬,均影響最終效能。