OPTION-Klausel (Transact-SQL)
Gilt für: SQL Server Azure SQL-Datenbank Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW) SQL Analytics-Endpunkt in Microsoft Fabric Warehouse in Microsoft Fabric
Gibt an, dass der angezeigte Abfragehinweis in der gesamten Abfrage verwendet werden soll. Jeder Abfragehinweis kann nur einmal angegeben werden, obwohl mehrere Abfragehinweise zulässig sind. Es kann nur eine OPTION
-Klausel pro Anweisung angegeben werden.
Diese Klausel kann in den Anweisungen SELECT
, DELETE
, UPDATE
und MERGE
angegeben werden.
Transact-SQL-Syntaxkonventionen
Syntax
Syntax für SQL Server, Azure SQL verwaltete Instanz und Azure SQL-Datenbank:
[ OPTION ( <query_hint> [ , ...n ] ) ]
Syntax für Warehouse in 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>'
Syntax für Azure Synapse Analytics and Analytics Platform System (PDW) und SQL Analytics-Endpunkt in 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
Syntax für serverlosen SQL-Pool in Azure Synapse Analytics:
OPTION ( <query_option> [ , ...n ] )
<query_option> ::=
LABEL = label_name
Argumente
query_hint
Schlüsselwörter, die angeben, dass Hinweise für den Optimierer verwendet werden, um die Verarbeitung der Anweisung durch die Datenbank-Engine anzupassen. Weitere Informationen finden Sie unter Abfragehinweise.
Beispiele
Die Transact-SQL-Codebeispiele in diesem Artikel verwenden die AdventureWorks2022
- oder AdventureWorksDW2022
-Beispieldatenbank, die Sie von der Homepage Microsoft SQL Server Samples and Community Projects herunterladen können.
A. Verwenden einer OPTION-Klausel mit einer GROUP BY-Klausel
Im folgenden Beispiel wird gezeigt, wie die OPTION
-Klausel in Verbindung mit einer GROUP BY
-Klausel verwendet wird.
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
Beispiele: Azure Synapse Analytics und Analytics-Plattformsystem (PDW)
B. SELECT-Anweisung mit einer Bezeichnung in der OPTION-Klausel
Das folgende Beispiel zeigt eine Azure Synapse Analytics-Anweisung SELECT
mit einer Bezeichnung in der OPTION
Klausel.
SELECT * FROM FactResellerSales
OPTION (LABEL = 'q17');
C. SELECT-Anweisung mit einem Abfragehinweis in der OPTION-Klausel
Das folgende Beispiel zeigt eine SELECT
Anweisung, die einen HASH JOIN
Abfragehinweis in der OPTION
Klausel verwendet.
-- Uses AdventureWorks
SELECT COUNT(*) FROM dbo.DimCustomer a
INNER JOIN dbo.FactInternetSales b
ON (a.CustomerKey = b.CustomerKey)
OPTION (HASH JOIN);
D: SELECT-Anweisung mit einer Bezeichnung und mehreren Abfragehinweisen in der OPTION-Klausel
Das folgende Beispiel ist eine Azure Synapse Analytics-Anweisung SELECT
, die eine Bezeichnung und mehrere Abfragehinweise enthält. Wenn die Abfrage auf den Computeknoten ausgeführt wird, wendet SQL Server eine Hash-Verknüpfung oder Zusammenführung an, entsprechend der Strategie, die SQL Server entscheidet, die optimal ist.
SELECT COUNT(*) FROM dbo.DimCustomer a
INNER JOIN dbo.FactInternetSales b
ON (a.CustomerKey = b.CustomerKey)
OPTION (Label = 'CustJoin', HASH JOIN, MERGE JOIN);
E. Verwenden eines Abfragehinweises beim Abfragen einer Sicht
Im folgenden Beispiel wird eine Ansicht namens CustomerView erstellt und dann ein HASH JOIN
Abfragehinweis in einer Abfrage verwendet, die auf eine Ansicht und eine Tabelle verweist.
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. Abfrage mit einer untergeordneten SELECT-Anweisung und einem Abfragehinweis
Im folgenden Beispiel wird eine Abfrage dargestellt, die sowohl eine untergeordnete SELECT-Anweisung als auch einen Abfragehinweis enthält. Der Abfragehinweis wird global angewendet. Abfragehinweise können nicht an die Subselect-Anweisung angefügt werden.
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. Erzwingen der Übereinstimmung der Joinreihenfolge mit der Reihenfolge in der Abfrage
Im folgenden Beispiel wird der FORCE ORDER
Hinweis verwendet, um zu erzwingen, dass der Abfrageplan die durch die Abfrage angegebene Verknüpfungsreihenfolge verwendet. Dieser Hinweis verbessert die Leistung einiger Abfragen, aber nicht alle Abfragen.
Diese Abfrage ruft Partitionsnummern, Grenzwerte, Grenzwerttypen und Zeilen pro Grenze für die Partitionen in der ProspectiveBuyer
Tabelle der ssawPDW
Datenbank ab.
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. Verwenden von EXTERNALPUSHDOWN
Im folgenden Beispiel wird der Pushdown der WHERE
Klausel auf den MapReduce-Auftrag in der externen Hadoop-Tabelle erzwungen.
SELECT ID FROM External_Table_AS A
WHERE ID < 1000000
OPTION (FORCE EXTERNALPUSHDOWN);
Im folgenden Beispiel wird verhindert, dass der Pushdown der WHERE
Klausel auf den MapReduce-Auftrag in der externen Hadoop-Tabelle ausgeführt wird. Alle Zeilen werden an PDW zurückgegeben, wo die WHERE
Klausel angewendet wird.
SELECT ID FROM External_Table_AS A
WHERE ID < 10
OPTION (DISABLE EXTERNALPUSHDOWN);
I. Abfragen von Daten zu einem bestimmten Zeitpunkt
Gilt für: Warehouse in Microsoft Fabric
Weitere Informationen finden Sie unter FOR TIMESTAMP-Abfragehinweis.
Verwenden Sie die TIMESTAMP
Syntax in der OPTION
Klausel, um Daten abzufragen, wie sie in der Vergangenheit in Synapse Data Warehouse in Microsoft Fabric vorhanden waren. Die folgende Beispielabfrage gibt Daten zurück, wie sie am 13. März 2024 um 19:39:35.28 Uhr UTC existierten. Die Zeitzone wird immer in UTC angegeben.
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