Share via


Clause OPTION (Transact-SQL)

S’applique à :SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)Point de terminaison analytique SQL dans Microsoft FabricEntrepôt dans Microsoft Fabric

Spécifie que l'indicateur de requête indiqué doit être utilisé dans l'ensemble de la requête. Chaque indicateur de requête ne peut être spécifié qu'une seule fois, bien que plusieurs indicateurs de requête soient autorisés. Une seule clause OPTION peut être spécifiée avec l'instruction.

Cette clause peut être spécifiée dans les instructions SELECT, DELETE, UPDATE, et MERGE.

Conventions de la syntaxe Transact-SQL

Syntaxe

Syntaxe pour SQL Server et Azure SQL Database

[ OPTION ( <query_hint> [ ,...n ] ) ]   

Syntaxe de l’entrepôt dans 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>' 

Syntaxe pour Azure Synapse Analytics et Système de plateforme analytique (PDW) et point de terminaison analytique SQL dans 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  

Syntaxe pour Pool SQL serverless dans Azure Synapse Analytics

OPTION ( <query_option> [ ,...n ] )

<query_option> ::=
    LABEL = label_name

Remarque

Pour afficher la syntaxe Transact-SQL pour SQL Server 2014 (12.x) et versions antérieures, consultez la Documentation sur les versions antérieures.

Arguments

query_hint

Mots clés spécifiant les indicateurs d'optimiseur utilisés pour personnaliser la façon dont le moteur de base de données traite l'instruction. Pour plus d’informations, consultez Indicateurs de requête (Transact-SQL).

Exemples

R. Utiliser une clause OPTION avec une clause GROUP BY

L'exemple suivant montre comment la clause OPTION est utilisée avec une clause 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  

Exemples : Azure Synapse Analytics et Analytics Platform System (PDW)

B. Instruction SELECT avec une étiquette dans la clause OPTION

L’exemple suivant montre une instruction SELECT Azure Synapse Analytics avec une étiquette dans la clause OPTION.

-- Uses AdventureWorks  
  
SELECT * FROM FactResellerSales  
  OPTION ( LABEL = 'q17' );  

C. Instruction SELECT avec un indicateur de requête dans la clause OPTION

L’exemple suivant montre une instruction SELECT qui utilise un indicateur de requête HASH JOIN dans la clause OPTION.

-- Uses AdventureWorks  
  
SELECT COUNT (*) FROM dbo.DimCustomer a  
INNER JOIN dbo.FactInternetSales b   
ON (a.CustomerKey = b.CustomerKey)  
OPTION (HASH JOIN);  

D. Instruction SELECT avec une étiquette et plusieurs indicateurs de requête dans la clause OPTION

L’exemple suivant est une instruction SELECT Azure Synapse Analytics qui contient une étiquette et plusieurs indicateurs de requête. Quand la requête est exécutée sur les nœuds de calcul, SQL Server applique une jointure de hachage ou une jointure de fusion, selon la stratégie optimale déterminée par 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. Utiliser un indicateur de requête pour interroger un affichage

L’exemple suivant crée un affichage nommé CustomerView, puis utilise un indicateur de requête HASH JOIN dans une requête qui fait référence à un affichage et une table.

-- 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. Requête avec une sous-sélection et un indicateur de requête

L’exemple suivant montre une requête qui contient une sous-sélection et un indicateur de requête. L’indicateur de requête est appliqué globalement. Les indicateurs de requête ne doivent pas être ajoutés à l’instruction de sous-sélection.

-- 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. Forcer la correspondance entre l’ordre de jointure et l’ordre dans la requête

L’exemple suivant utilise l’indicateur FORCE ORDER pour forcer le plan de requête à utiliser l’ordre de jointure spécifié par la requête. Cela permet d’améliorer les performances de certaines requêtes, mais pas de toutes les requêtes.

-- 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. Utiliser EXTERNALPUSHDOWN

L’exemple suivant force l’envoi (pushdown) de la clause WHERE au travail MapReduce sur la table Hadoop externe.

SELECT ID FROM External_Table_AS A   
WHERE ID < 1000000  
OPTION (FORCE EXTERNALPUSHDOWN);  

L’exemple suivant empêche l’envoi (pushdown) de la clause WHERE au travail MapReduce sur la table Hadoop externe. Toutes les lignes sont retournées à PDW où la clause WHERE est appliquée.

SELECT ID FROM External_Table_AS A   
WHERE ID < 10  
OPTION (DISABLE EXTERNALPUSHDOWN);  

I. Interroger des données à partir d’un point dans le temps

S'applique à : Warehouse dans Microsoft Fabric

Pour plus d’informations, consultez Indicateur de requête FOR TIMESTAMP.

Utilisez la syntaxe TIMESTAMP de la clause OPTION pour interroger les données telles qu’elles existaient dans le passé, dans Synapse Data Warehouse dans Microsoft Fabric. L’exemple de requête suivant retourne des données telles qu’elles apparaissent le 13 mars 2024 à 7:39:35.28 UTC. Le fuseau horaire est toujours au format 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