了解查詢提示

已完成

查詢提示是可套用來強制查詢處理器在執行計畫中針對 SELECTINSERTUPDATEDELETE 陳述式使用特定運算子的選項或策略。 查詢提示會覆寫查詢處理器可能針對使用 OPTION 子句之指定查詢選取的任何執行計畫。

在大部分情況下,查詢最佳化工具會根據索引、統計資料和資料散發來選取有效率的執行計畫。 資料庫管理員很少需要手動介入。

您可以將查詢提示新增至查詢結尾,來變更查詢的執行計畫。 例如,如果您將 OPTION (MAXDOP <integer_value>) 新增至使用單一 CPU 的查詢結尾,查詢可能會根據您選擇的值,使用多個 CPU (平行處理原則)。 或者,您可以使用 OPTION (RECOMPILE) 來確保每次執行查詢時,都會產生新的暫存計畫。

--With maxdop hint
SELECT ProductID, OrderQty, SUM(LineTotal) AS Total  
FROM Sales.SalesOrderDetail  
WHERE UnitPrice < $5.00  
GROUP BY ProductID, OrderQty  
ORDER BY ProductID, OrderQty  
OPTION (MAXDOP 2)
GO

--With recompile hint
SELECT City
FROM Person.Address
WHERE StateProvinceID=15 OPTION (RECOMPILE)
GO

雖然查詢提示可為各種效能相關問題提供當地語系化的解決方案,但您應該避免在實際執行環境中使用,原因如下。

  • 在查詢上具有永久查詢提示,可能會導致對該查詢有幫助的結構資料庫變更變得不適用。
  • 如果您將查詢繫結至特定執行計畫,則無法受益於後續 SQL Server 版本的新功能和增強功能。

不過,SQL Server 有數個可用於不同用途的查詢提示。 以下將討論其中一些查詢提示:

  • FAST <integer_value> - 擷取前 <integer_value> 個資料列,同時繼續執行查詢。 較適用於快速查詢提示的小型資料集和低值。 隨著資料列計數增加,查詢成本會變高。

  • OPTIMIZE FOR - 指示查詢最佳化工具在編譯和最佳化查詢時,應該使用區域變數的特定值。

  • USE PLAN - 查詢最佳化工具會使用由 xml_plan 屬性指定的查詢計劃。

  • RECOMPILE - 為查詢建立新的暫存計畫,並在執行查詢之後立即捨棄。

  • { LOOP | MERGE | HASH } JOIN - 指定在整個查詢中由 LOOP JOINMERGE JOINHASH JOIN 執行所有聯結作業。 如果您指定多個聯結提示,最佳化工具會從選項中選擇成本最低的聯結策略。

  • MAXDOP <integer_value> - 覆寫 sp_configure 的平行處理原則最大程度值。 指定此選項的查詢也會覆寫 Resource Governor。

您也可以在相同的查詢中套用多個查詢提示。 下列範例會在相同的查詢中使用 HASH GROUPFAST <integer_value> 查詢提示。

SELECT ProductID, OrderQty, SUM(LineTotal) AS Total  
FROM Sales.SalesOrderDetail  
WHERE UnitPrice < $5.00  
GROUP BY ProductID, OrderQty  
ORDER BY ProductID, OrderQty  
OPTION (HASH GROUP, FAST 10);  
GO    

若要深入了解查詢提示,請參閱提示 (Transact-SQL)

查詢存放區提示 (在預覽階段)

Azure SQL Database 中的查詢存放區提示功能提供簡單的查詢計劃成形方法,而不需要修改應用程式程式碼。

當查詢最佳化工具不會產生有效率的執行計畫,以及開發人員或 DBA 無法修改原始查詢文字時,查詢存放區提示會很有用。 在某些應用程式中,查詢文字可能會硬式編碼或自動產生。

Screenshot of how Query Store hints work.

若要使用查詢存放區提示,您必須透過查詢存放區目錄檢視、內建查詢存放區報表或 Azure SQL Database 的查詢效能深入解析,識別您想要修改之查詢陳述式的查詢存放區 query_id。 然後,使用此 query_id 及您想要套用至查詢的查詢提示字串來執行 sp_query_store_set_hints

下列範例示範如何取得特定查詢的 query_id,然後使用其將 RECOMPILEMAXDOP 提示套用至查詢。

SELECT q.query_id, qt.query_sql_text
FROM sys.query_store_query_text qt 
    INNER JOIN sys.query_store_query q 
        ON qt.query_text_id = q.query_text_id 
WHERE query_sql_text like N'%ORDER BY CustomerName DESC%'  
  AND query_sql_text not like N'%query_store%'
GO

--Assuming the query_id returned by the previous query is 42
EXEC sys.sp_query_store_set_hints @query_id= 42, @query_hints = N'OPTION(RECOMPILE, MAXDOP 1)'
GO

在幾個情況下,查詢存放區提示可能有助於解決查詢層級效能問題。

  • 每次執行查詢時重新編譯查詢。
  • 限制統計資料更新作業之平行處理原則的最大程度。
  • 使用雜湊聯結,而不是巢狀迴圈聯結。
  • 針對特定查詢使用相容性層級 110,同時讓資料庫保持目前相容性。

注意

SQL 受控執行個體也支援查詢存放區提示。

如需查詢存放區提示的詳細資訊,請參閱查詢存放區提示