OPTION 子句 (Transact-SQL)
适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例Azure Synapse AnalyticsAnalytics Platform System (PDW)Microsoft Fabric 中的 SQL 分析终结点Microsoft Fabric 中的仓库
指定应在整个查询中使用所指定的查询提示。 每个查询提示只能指定一次,但允许指定多个查询提示。 使用该语句只能指定一个 OPTION 子句。
可以在 SELECT、DELETE、UPDATE 和 MERGE 语句中指定此子句。
语法
SQL Server 和 Azure SQL 数据库的语法
[ OPTION ( <query_hint> [ ,...n ] ) ]
Azure Synapse Analytics 和 Analytics Platform System (PDW)的语法
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
注意
若要查看 SQL Server 2014 (12.x) 及更早版本的 Transact-SQL 语法,请参阅早期版本文档。
自变量
query_hint
关键字,指示优化器提示用于自定义数据库引擎处理语句的方式。 有关详细信息,请参阅 查询提示 (Transact-SQL)。
示例
A. 将 OPTION 子句与 GROUP BY 子句一起使用
以下示例说明了如何将 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 语句。
-- Uses AdventureWorks
SELECT * FROM FactResellerSales
OPTION ( LABEL = 'q17' );
C. 在 OPTION 子句中包含查询提示的 SELECT 语句
以下示例显示了在 OPTION 子句中使用 HASH JOIN 查询提示的 SELECT 语句。
-- 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 决定的最优策略,应用哈希联接或合并联接。
-- Uses AdventureWorks
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 查询提示。
-- Uses the AdventureWorks sample database
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. 包含子查询和查询提示的查询
以下示例显示包含子查询和查询提示的查询。 查询提示将全局应用。 不允许将查询提示追加到子查询语句。
-- Uses the AdventureWorks sample database
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 提示强制查询计划使用查询指定的联接顺序。 这将提高某些(而不是所有)查询的性能。
-- Uses AdventureWorks
-- Obtain partition numbers, boundary values, boundary value types, and rows per boundary
-- for the partitions in the ProspectiveBuyer table of the ssawPDW database.
SELECT sp.partition_number, prv.value AS boundary_value, lower(sty.name) AS boundary_value_type, sp.rows
FROM sys.tables st JOIN sys.indexes si ON st.object_id = si.object_id AND si.index_id <2
JOIN sys.partitions sp ON sp.object_id = st.object_id AND sp.index_id = si.index_id
JOIN sys.partition_schemes ps ON ps.data_space_id = si.data_space_id
JOIN sys.partition_range_values prv ON prv.function_id = ps.function_id
JOIN sys.partition_parameters pp ON pp.function_id = ps.function_id
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);
另请参阅
提示 (Transact-SQL)
SELECT (Transact-SQL)
UPDATE (Transact-SQL)
MERGE (Transact-SQL)
DELETE (Transact-SQL)
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈