Partage 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, Azure SQL Managed Instance 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 and Analytics Platform System (PDW) et point de terminaison d’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 du 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.

Exemples

Les exemples de code Transact-SQL de cet article sont fondés sur l’échantillon de base de données AdventureWorks2022 ou AdventureWorksDW2022 fourni, que vous pouvez télécharger à partir de la page d’accueil Échantillons et projets communautaires Microsoft SQL Server.

A. 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 Azure Synapse Analytics SELECT avec une étiquette dans la OPTION clause.

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 qui utilise un SELECTHASH JOIN indicateur de requête dans la OPTION clause.

-- 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 Azure Synapse Analytics SELECT qui contient une étiquette et plusieurs indicateurs de requête. Lorsque 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 que SQL Server décide est la plus optimale.

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 une vue nommée CustomerView, puis utilise un HASH JOIN indicateur de requête dans une requête qui référence une vue et une table.

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 peuvent pas être ajoutés à l’instruction de sous-sélection.

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. Cet indicateur améliore les performances sur certaines requêtes, mais pas toutes les requêtes.

Cette requête obtient des numéros de partition, des valeurs de limite, des types de valeurs de limite et des lignes par limite pour les partitions de la ProspectiveBuyer table de la ssawPDW base de données.

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

L’exemple suivant force le pushdown de la WHERE clause à la tâche MapReduce sur la table Hadoop externe.

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

L’exemple suivant empêche le pushdown de la WHERE clause vers la tâche MapReduce sur la table Hadoop externe. Toutes les lignes sont retournées à PDW où la WHERE clause 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