天天看點

查詢優化建議

某些查詢占用的資源比其他查詢占用的資源多。例如,傳回大型結果集的查詢和那些包含 WHERE 子句(并非唯一子句)的查詢總是占用大量資源。與不太複雜的查詢相比,查詢優化器的智能水準無法消除這些構造的資源開銷。SQL Server 使用最佳通路計劃,但查詢優化會受到可通路内容的限制。

盡管如此,您可以執行下列操作來提高查詢性能:

添加更多記憶體。當伺服器運作許多複雜查詢且其中幾個查詢執行很慢時,此解決方案尤其有用。

使用多個處理器。多個處理器允許資料庫引擎使用并行查詢。有關詳細資訊,請參閱。

重寫查詢。請注意下列事項:

如果查詢使用遊标,則确定是否可以使用效率更高的遊标類型(如快速隻進遊标)或單個查詢編寫遊标查詢。單個查詢的性能通常優于遊标操作。因為一組遊智語句通常是一個外循環操作,在此操作中,一旦使用内部語句便開始處理外循環中的每一行,是以可考慮使用 GROUP BY 或 CASE 語句,或者使用子查詢來替代。有關詳細資訊,請參閱和。

如果應用程式使用循環,可考慮将循環放入查詢内。應用程式經常包含帶參數化查詢的循環,該循環執行許多次并要求運作應用程式的計算機與 SQL Server 之間有網絡往返。可改用臨時表建立一個更複雜的單一查詢。隻需要一個網絡往返,查詢優化器就可以更好地優化該單個查詢。有關詳細資訊,請參閱 和 。

不要在同一查詢中為一個表使用多個别名來模拟索引交集。這已沒有必要,因為 SQL Server 會自動考慮索引交集并可以在同一查詢中對同一個表使用多個索引。請參閱以下示例查詢:

複制代碼

SQL Server 可以為 <b>partkey</b> 和 <b>shipdate</b> 列使用索引,然後在兩個子集之間執行哈希比對來擷取索引交集。

查詢參數化用于允許重複使用緩存的查詢執行計劃。如果一組查詢具有相同的查詢哈希和查詢計劃哈希,則可以通過建立一個參數化查詢來提高性能。如果調用具有參數的一個查詢,而不是調用具有文字值的多個查詢,則會允許重用緩存查詢執行計劃。有關詳細資訊,請參閱和。

如果無法修改應用程式,則可以使用帶有強制參數化的模闆計劃指南來獲得類似結果。有關詳細資訊,請參閱。

隻在必要時使用查詢提示。如果查詢使用在早期版本的 SQL Server 上執行的提示,則應在不指定提示的情況下對其進行測試。提示會阻礙查詢優化器選擇更好的執行計劃。有關詳細資訊,請參閱 。

使用 query_plan_hash 可捕獲、存儲和比較一段時間内的查詢的查詢執行計劃。例如,更改系統配置之後,可以将任務關鍵查詢的查詢計劃哈希值與其原始查詢計劃哈希值進行比較。通過查詢計劃哈希值的不同可以了解系統配置更改是否會導緻更新重要查詢的查詢執行計劃。如果 sys.dm_exec_requests 中目前長時間運作的查詢的查詢計劃哈希與其基準查詢計劃哈希(通常認為該查詢具有良好的性能)不同,則也可以決定停止執行該查詢。有關詳細資訊,請參閱。

使用 <b>query governor</b> 配置選項。<b>query governor</b> 配置選項可用于防止長時間執行的查詢占用系統資源。預設情況下,該選項設定為允許執行所有查詢,而不管它們需要多長時間。但是,您還可以設定查詢調控器來限制允許所有查詢執行所有連接配接所用的最大秒數,或者僅限制查詢執行一個特定連接配接的時間。因為查詢調控器以估計的查詢開銷而不是實際的占用時間為基礎,是以它沒有任何運作時開銷。它還會在長時間執行的查詢開始之前将其停止,而不是将它們運作到某個預定義的限制時間。有關詳細資訊,請參閱 和 。

通過計劃緩存優化查詢計劃的重新使用。資料庫引擎對查詢計劃進行緩存以備重新使用。如果查詢計劃不進行緩存,則永遠不能重新使用。然而,每次執行未緩存的查詢計劃時,必須對其進行編譯,這就導緻性能降低。下列 Transact-SQL SET 語句選項可阻止重新使用已緩存的查詢計劃。包含這些處于 ON 狀态的 SET 選項的 Transact-SQL 批處理無法與 SET 選項處于 OFF 狀态時所編譯的相同批處理共享其查詢計劃:

SET ANSI_NULL_DFLT_OFF

SET ANSI_NULL_DFLT_ON

SET ANSI_NULLS

SET ANSI_PADDING

SET ANSI_WARNINGS

SET ARITHABORT

SET CONCAT_NULL_YIELDS_NULL

SET DATEFIRST

SET DATEFORMAT

SET FORCEPLAN

SET LANGUAGE

SET NO_BROWSETABLE

SET NUMERIC_ROUNDABORT

SET QUOTED_IDENTIFIER

SET TEXTSIZE

此外,由于 SET ANSI_DEFAULTS 選項可用于更改 ANSI_NULLS、ANSI_NULL_DFLT_ON、ANSI_PADDING、ANSI_WARNINGS、CURSOR_CLOSE_ON_COMMIT、IMPLICIT_TRANSACTIONS 和 QUOTED_IDENTIFIER SET 選項,是以該選項會影響已緩存查詢計劃的重新使用。請注意,SET ANSI_DEFAULTS 可以更改的大部分 SET 選項都列為可能會影響查詢計劃重新使用的 SET 選項。

可以使用下列方法更改其中某些 SET 選項:

使用 <b>sp_configure</b> 存儲過程進行伺服器範圍的更改。有關詳細資訊,請參閱 。

使用 ALTER DATABASE 語句的 SET 子句。有關詳細資訊,請參閱 。

更改 OLE DB 和 ODBC 連接配接設定。有關詳細資訊,請參閱。

注意:

隻有在連接配接時建立 SET 選項并確定它們在連接配接期間不發生變化,才能避免 SET 選項出現重新編譯查詢計劃的情況。某些 SET 選項必須設定為特定值,才能使用索引視圖或計算列的索引。有關詳細資訊,請參閱。