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=c1 from t1 where c1=2 option(recompile,querytraceon 2389);
select @v_test=c1 from t1 where c1=2 option(recompile,queryruleoff OmitMyidx);
上述第二個語句顯示的語法也許會導致“no plan”錯誤。預先未與開發人員討論以確保完全理解該規則及禁用可能帶來的後果,就不應該使用QUERYRULEOFF。資料庫屬主通常擁有建立一個計劃指導(plan guide)所需的足夠許可權,而用QUERYTRACEON/QUERYRULEOFF提示建立一個計劃指導則需要sysadmin許可權,因為改變這些設定也許有系統而非資料庫範圍的含義。
結論
最後,清楚你的環境中何時使用這些查詢最佳化或查詢調優技術很重要,請在使用這些技術前,分析具體情況並進行足夠的測試。.
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8484829/viewspace-2151122/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Microsoft SQL Server查詢最佳化方法ROSSQLServer
- SQL 兩個表組合查詢SQL
- SQL Server 查詢分解SQLServer
- 使用SSMS連線和查詢 SQL Server 例項SSMSQLServer
- 50種方法最佳化SQL Server資料庫查詢SQLServer資料庫
- SQL Server中“加鎖選項”的功能說明SQLServer
- SQL Server遞迴查詢SQLServer遞迴
- SQL SERVER 查詢鎖資訊SQLServer
- SQL server跨庫查詢SQLServer
- Sql Server系列:子查詢SQLServer
- SQL server 查詢語句SQLServer
- SQL Server 分散式查詢SQLServer分散式
- SQL SERVER 動態查詢SQLServer
- SQL Server 跨域查詢SQLServer跨域
- SQL Server中基於WEB的資料庫查詢SQLServerWeb資料庫
- Sql Server 的引數化查詢SQLServer
- sql server的許可權查詢SQLServer
- 查詢當前SQL Server的版本SQLServer
- MS SQL Server的遞迴查詢SQLServer遞迴
- SQL Server中Table字典資料的查詢SQL示例程式碼SQLServer
- SQL 獲取SQL Server中兩個日期之間的所有日期SQLServer
- 兩個B1相關的SQL,訂單查詢SQL
- Ms Sql Server查詢儲存過程中的內容SQLServer儲存過程
- sql-server高階查詢SQLServer
- SQL Server阻塞查詢語句SQLServer
- Sql Server系列:巢狀查詢SQLServer巢狀
- SQL Server 查詢優化功能SQLServer優化
- sql server分組查詢示例SQLServer
- 通過SQL查詢兩張表中不匹配的行SQL
- SQL Server查詢慢的解決方案SQLServer
- SQL SERVER 條件語句的查詢SQLServer
- MS SQL Server的遞迴查詢(2)SQLServer遞迴
- SQL SERVER 引數化選項SQLServer
- SQL Server在所有表中查詢(在整個庫搜尋內容)SQLServer
- JN專案-查詢的下拉選項只應顯示列表中存在的選項
- SQL Server解惑——查詢條件IN中能否使用變數SQLServer變數
- 在 SQL Server 中查詢活動連線和死鎖SQLServer
- 淺談SQL Server中統計對於查詢的影響SQLServer