Freigeben über


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