OPTION 子句 (Transact-SQL)
適用於:SQL Server Azure SQL 資料庫 Azure SQL 受控執行個體 Azure Synapse Analytics Analytics Platform System (PDW) Microsoft Fabric 的 SQL 端點分析 Microsoft Fabric 的倉儲
指定所指出的查詢提示應該用於整個查詢。 雖然可以有多個查詢提示,不過每個查詢提示只能指定一次。 只有一個 OPTION
子句可以利用陳述式加以指定。
您可以在 SELECT
、DELETE
、UPDATE
和 MERGE
陳述式中指定該子句。
Syntax
SQL Server、Azure SQL 受控執行個體 和 Azure SQL 資料庫 的語法:
[ OPTION ( <query_hint> [ , ...n ] ) ]
Microsoft Fabric 中倉儲的語法:
OPTION ( <query_option> [ , ...n ] )
<query_option> ::=
LABEL = label_name |
<query_hint>
<query_hint> ::=
HASH JOIN
| LOOP JOIN
| MERGE JOIN
| FORCE ORDER
| { FORCE | DISABLE } EXTERNALPUSHDOWN
| FOR TIMESTAMP AS OF '<point_in_time>'
Microsoft Fabric 中 Azure Synapse Analytics 和分析平台系統 (PDW) 和 SQL 分析端點的語法:
OPTION ( <query_option> [ , ...n ] )
<query_option> ::=
LABEL = label_name |
<query_hint>
<query_hint> ::=
HASH JOIN
| LOOP JOIN
| MERGE JOIN
| FORCE ORDER
| { FORCE | DISABLE } EXTERNALPUSHDOWN
Azure Synapse Analytics 中無伺服器 SQL 集區的語法:
OPTION ( <query_option> [ , ...n ] )
<query_option> ::=
LABEL = label_name
引數
query_hint
關鍵字,它們會指出要使用哪一個最佳化工具提示來自訂 Database Engine 處理陳述式的方式。 如需詳細資訊,請參閱查詢提示。
範例
本文 Transact-SQL 程式碼範例使用 AdventureWorks2022
或 AdventureWorksDW2022
範例資料庫,從 Microsoft SQL Server Samples 和 Community Projects (Microsoft SQL Server 範例和社群專案)首頁即可下載。
A. 搭配 GROUP BY 子句使用 OPTION 子句
下列範例會顯示如何搭配 OPTION
子句來使用 GROUP BY
子句。
USE AdventureWorks2022;
GO
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
範例:Azure Synapse Analytics 和 Analytics Platform System (PDW)
B. OPTION 子句中含有標籤的 SELECT 陳述式
下列範例顯示子句中具有卷標的 OPTION
Azure Synapse Analytics SELECT
語句。
SELECT * FROM FactResellerSales
OPTION (LABEL = 'q17');
C. OPTION 子句中含有查詢提示的 SELECT 陳述式
下列範例顯示 SELECT
語句,其使用 HASH JOIN
子句中的 OPTION
查詢提示。
-- Uses AdventureWorks
SELECT COUNT(*) FROM dbo.DimCustomer a
INNER JOIN dbo.FactInternetSales b
ON (a.CustomerKey = b.CustomerKey)
OPTION (HASH JOIN);
D. OPTION 子句中含有一個標籤和多個查詢提示的 SELECT 陳述式
下列範例是包含標籤和多個查詢提示的 Azure Synapse Analytics SELECT
語句。 當查詢在計算節點上執行時,SQL Server 會根據 SQL Server 決定的最佳策略,套用哈希聯結或合併聯結。
SELECT COUNT(*) FROM dbo.DimCustomer a
INNER JOIN dbo.FactInternetSales b
ON (a.CustomerKey = b.CustomerKey)
OPTION (Label = 'CustJoin', HASH JOIN, MERGE JOIN);
E. 在查詢檢視表時使用查詢提示
下列範例會建立名為 CustomerView 的檢視,然後在 HASH JOIN
參考檢視和數據表的查詢中使用查詢提示。
CREATE VIEW CustomerView
AS
SELECT CustomerKey,
FirstName,
LastName
FROM ssawPDW..DimCustomer;
GO
SELECT COUNT(*)
FROM dbo.CustomerView a
INNER JOIN dbo.FactInternetSales b
ON (a.CustomerKey = b.CustomerKey)
OPTION (HASH JOIN);
GO
DROP VIEW CustomerView;
GO
F. 含有子選擇和查詢提示的查詢
下列範例示範一個同時包含子選擇和查詢提示的查詢。 查詢提示會在全域套用。 查詢提示無法附加至子選取語句。
CREATE VIEW CustomerView
AS
SELECT CustomerKey,
FirstName,
LastName
FROM ssawPDW..DimCustomer;
GO
SELECT *
FROM (
SELECT COUNT(*) AS a
FROM dbo.CustomerView a
INNER JOIN dbo.FactInternetSales b
ON (a.CustomerKey = b.CustomerKey)
) AS t
OPTION (HASH JOIN);
G. 強制聯結順序與查詢中的順序相符
下列範例會 FORCE ORDER
使用提示來強制查詢計劃使用查詢所指定的聯結順序。 此提示可改善某些查詢的效能,但並非所有查詢。
此查詢會取得資料庫數據表ssawPDW
中ProspectiveBuyer
數據分割的數據分割編號、界限值、界限值類型,以及每個界限的數據列。
SELECT sp.partition_number,
prv.value AS boundary_value,
lower(sty.name) AS boundary_value_type,
sp.rows
FROM sys.tables st
INNER JOIN sys.indexes si
ON st.object_id = si.object_id AND si.index_id < 2
INNER JOIN sys.partitions sp
ON sp.object_id = st.object_id AND sp.index_id = si.index_id
INNER JOIN sys.partition_schemes ps
ON ps.data_space_id = si.data_space_id
INNER JOIN sys.partition_range_values prv
ON prv.function_id = ps.function_id
INNER JOIN sys.partition_parameters pp
ON pp.function_id = ps.function_id
INNER JOIN sys.types sty
ON sty.user_type_id = pp.user_type_id AND prv.boundary_id = sp.partition_number
WHERE st.object_id = (
SELECT object_id
FROM sys.objects
WHERE name = 'FactResellerSales'
)
ORDER BY sp.partition_number
OPTION (FORCE ORDER);
H. 使用 EXTERNALPUSHDOWN
下列範例會強制將 子句下 WHERE
推至外部 Hadoop 數據表上的 MapReduce 作業。
SELECT ID FROM External_Table_AS A
WHERE ID < 1000000
OPTION (FORCE EXTERNALPUSHDOWN);
下列範例會防止將 子句下 WHERE
推至外部 Hadoop 數據表上的 MapReduce 作業。 所有數據列都會傳回套用 子句的 WHERE
PDW。
SELECT ID FROM External_Table_AS A
WHERE ID < 10
OPTION (DISABLE EXTERNALPUSHDOWN);
I. 查詢某個時間點的資料
適用於:Microsoft Fabric 的倉儲
如需詳細資訊,請參閱 FOR TIMESTAMP 查詢提示。
在 Microsoft Fabric 中 Synapse 資料倉儲中,使用 OPTION
子句中的 TIMESTAMP
語法來查詢過去存在的資料。 下列範例查詢會傳回時間點為 2024 年 3 月 13 日下午 7:39:35.28 UTC 的資料。 時區一律為 UTC。
SELECT OrderDateKey,
SUM(SalesAmount) AS TotalSales
FROM FactInternetSales
GROUP BY OrderDateKey
ORDER BY OrderDateKey
OPTION (FOR TIMESTAMP AS OF '2024-03-13T19:39:35.28');--March 13, 2024 at 7:39:35.28 PM UTC