CLAUSE OPTION (Transact-SQL)
S’applique à : SQL Server Base de données Azure SQL Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW) Point de terminaison d'analyse SQL dans Microsoft Fabric Entrepôt dans Microsoft Fabric Base de données SQL 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
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.
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 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 SELECT
HASH 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 à : Entrepôt 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