共用方式為


使用最佳化化巢狀循環或批次排序的查詢可能會發生高 CPU 或記憶體授與

本文可協助您解決在 SQL Server 中執行查詢時發生高 CPU 使用量的問題。

適用於:SQL Server
原始 KB 編號: 2009160

徵兆

當您操作Microsoft具有高度並行工作負載的 SQL Server 時,您可能會注意到查詢中有一些效能問題。 此行為可能會顯示為中到高CPU使用量或極端記憶體授與要求。

您也可以遇到其他副作用,例如 OOM 條件、計劃快取收回的記憶體壓力,或非預期的 RESOURCE_SEMAPHORE 等候。

此外,您可能會注意到耗用大量 CPU 或記憶體之查詢的查詢計劃,巢 狀循環聯結運算子的 OPTIMIZED 屬性設定為 True

原因

在某些情況下,SQL Server 查詢處理器引進選擇性排序作業以改善效能時,可能會發生此問題。 此作業稱為「優化巢狀循環」或「批次排序」,而查詢優化器會判斷何時最能引進這些運算符。 在罕見的情況下,查詢只會觸及幾個數據列,但排序作業的設定成本非常顯著,以至於優化巢狀迴圈的成本超過其優點。 因此,在這些情況下,相較於預期的效能,您可能會觀察到效能變慢。

解決方法

追蹤旗標 2340

若要修正此問題,請使用追蹤旗標 2340 來停用優化。 追蹤旗標 2340 會指示查詢處理器在產生查詢計劃時,不要針對優化的巢狀循環聯結使用排序作業(批次排序)。 這會影響整個實例。

啟用此追蹤旗標之前,您可以徹底測試應用程式,以確保您在停用此優化時會獲得預期的效能優勢。 這是因為當計劃所接觸的數據列數目大幅增加時,排序優化會很有説明。

如需詳細資訊,請參閱 DBCC TRACEON - 追蹤旗標 (Transact-SQL)

修改程序代碼以使用DISABLE_OPTIMIZED_NESTED_LOOP提示

或者,套用下列 DISABLE_OPTIMIZED_NESTED_LOOP 查詢提示,以停用查詢層級的優化。

SELECT * FROM Person.Address  
WHERE City = 'SEATTLE' AND PostalCode = 98104
OPTION (USE HINT (DISABLE_OPTIMIZED_NESTED_LOOP)); 

如需詳細資訊,請參閱 DISABLE_OPTIMIZED_NESTED_LOOP

其他相關資訊

Database Engine 服務啟動選項

適用於

  • SQL Server 2005 到 SQL Server 2019