SQL Server查詢優化中的兩個選項
本文中,我們將介紹兩個SQL Server中的可用概念,它們是使用SQL Server時值得註意的技術。
1. OPTIMIZE FOR Unknown
SQL Server 2005版本中增加了OPTIMIZE FOR提示(hint),允許DBA確定用於基數評估和優化的字面值。如果我們有一張數據分布傾斜的表,OPTIMIZE FOR能被用於優化為廣泛範圍參數值提供合理性能的通用值。當對所有參數值來說性能並非最好時,相比有時做查找(seek,對於選擇性較好的參數值),有時做掃描(scan,對於選擇性一般的參數值),所有場景具備同樣的執行時間也許會更可取,這依賴於最初編譯期間傳入的參數值。
不幸的是,OPTIMIZE FOR僅允許字面值。如果變量為類似日期時間(datetime)或順序數(其本質隨時間而增長),那麽,確定的任何固定值不久將因變得過時而不得不修改該提示來確定一個新值。即使該參數值域隨時間保持相對穩定,但提供字面值時你不得不實驗和發現一個足夠好的通用值,這有時是很難的或很費時間的。
最後,為OPTIMIZER FOR提供數值將通過改變使用該參數的謂詞基數評估而影響計劃的選擇。在OPTIMIZE FOR提示中,如果你提供了一個不存在或稀有值,那麽,你就減少了基數評估值,這將會影響成本和最終計劃的選擇。
如果你只想得到一個“平均”值而並不關心該值是什麽,OPTIMIZE FOR (@variable_name UNKNOWN)提示將導致優化器忽略影響基數評估的這個參數值。取而代之是用柱狀圖,基數評估將由密度、關鍵信息或依賴謂詞的固定選擇性評估得出。這將導致一個並不需要DBA必須一直監視和改變參數值來維護一致性能的可預見評估。
語法變化將告訴優化器忽視所有參數值,這只需確定OPTIMIZE FOR UNKNOWN並漏掉括號和變量名。確定OPTIMIZE FOR將導致ParameterCompiledValue從showplan XML輸出中消失,正像參數嗅探(sniffing)沒有發生一樣。不管傳遞的參數,最終計劃將是一樣的,並且,也許會給出更加可預見的查詢性能。
2. QUERYTRACEON 和QUERYRULEOFF
有些場景中,開發人員也許建議用跟蹤標誌(trace flag)來避免查詢計劃或優化器問題。或者,他們也許發現禁用某個特定優化器規則會阻止特定問題的發生。一些跟蹤標誌很常見,以至於難以預見開啟這些跟蹤標誌是否能很好的解決所有查詢問題,或該問題是否只針對研究的特定查詢。類似的,大多數優化器規則並非本身不好,整個系統範圍內禁用該規則可能會導致其他方面的性能退化。
SQL Server 2008中,可以在特定查詢運行期間開啟某個跟蹤標誌,或通過如下未被歸檔QUERYTRACEON或QUERYRULEOFF提示僅在查詢編譯期間禁用某個優化器規則。
select @v_test=c1from t1 where c1=2 option(recompile,querytraceon 2389);
select @v_test=c1from t1 where c1=2 option(recompile,queryruleoff OmitMyidx);
上述第二個語句顯示的語法也許會導致“no plan”錯誤。預先未與開發人員討論以確保完全理解該規則及禁用可能帶來的後果,就不應該使用QUERYRULEOFF。數據庫屬主通常擁有創建一個計劃指導(plan guide)所需的足夠權限,而用QUERYTRACEON/QUERYRULEOFF提示創建一個計劃指導則需要sysadmin權限,因為改變這些設置也許有系統而非數據庫範圍的含義。
結論
最後,清楚你的環境中何時使用這些查詢優化或查詢調優技術很重要,請在使用這些技術前,分析具體情況並進行足夠的測試。.
SQL Server查詢優化中的兩個選項