查詢提示 允許開發者強制指定執行計畫策略,覆蓋查詢最佳化程式的選擇。雖威力強大,但濫用會導致計畫固化、效能退化,微軟建議僅作為經驗豐富 DBA 的最後手段。
LOOP JOIN, HASH JOIN, MERGE JOIN,指定聯接演算法。OPTION (hint) 子句指定,影響整個查詢。常用:RECOMPILE, OPTIMIZE FOR, MAXDOP, FAST n。WITH (NOLOCK), WITH (INDEX(idx_name)), WITH (FORCESEEK)。SELECT select_list
FROM table_source [WITH (table_hint)]
WHERE search_condition
OPTION (query_hint [, ...n]);
| 提示 | 用途 | 風險 |
|---|---|---|
RECOMPILE | 每次執行重新編譯,適用參數嗅探問題 | 編譯 CPU 開銷大 |
OPTIMIZE FOR (@p = 'value') | 指定參數值優化,解決參數嗅探 | 若實際值分佈差異大,計畫不佳 |
MAXDOP n | 限制平行度 | 可能導致大查詢變慢 |
FAST n | 優先快速回傳前 n 列 | 總體執行時間可能增加 |
-- 臟讀 (不加鎖讀取)
SELECT * FROM Orders WITH (NOLOCK) WHERE OrderDate > '2024-01-01';
-- 強制使用特定索引
SELECT * FROM Orders WITH (INDEX(IX_OrderDate)) WHERE OrderDate > '2024-01-01';
-- 強制索引搜尋
SELECT * FROM Orders WITH (FORCESEEK) WHERE OrderID = 123;
Query Store (SQL Server 2016+) 監控計畫變化,針對退化計畫施以提示。若提示導致最佳化程式無法產生有效計畫,將拋出錯誤 8622,需移除或調整提示。