Condividi tramite


Clausola OPTION (Transact-SQL)

Si applica a:SQL ServerDatabase SQL di AzureIstanza gestita di SQL di AzureAzure Synapse AnalyticsPiattaforma di strumenti analitici (PDW)Endpoint di analisi SQL in Microsoft FabricWarehouse in Microsoft Fabric

Specifica che l'hint per la query indicato deve essere utilizzato in tutta la query. Sono consentiti più hint per la query. Ogni hint, tuttavia, può essere specificato una sola volta. In una istruzione è consentito utilizzare una sola clausola OPTION.

Questa clausola può essere specificata nelle istruzioni SELECT, DELETE,UPDATE, e MERGE .

Convenzioni relative alla sintassi Transact-SQL

Sintassi

Sintassi per SQL Server, Istanza gestita di SQL di Azure e database SQL di Azure:

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

Sintassi per 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>'

Sintassi per Azure Synapse Analytics and Analytics Platform System (PDW) e endpoint di analisi SQL 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

Sintassi per il pool SQL serverless in Azure Synapse Analytics:

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

<query_option> ::=
    LABEL = label_name

Nota

Per visualizzare la sintassi Transact-SQL per SQL Server 2014 (12.x) e versioni precedenti, vedere Documentazione delle versioni precedenti.

Argomenti

query_hint

Parole chiave che indicano quali hint di ottimizzazione vengono utilizzati per personalizzare la modalità di elaborazione dell'istruzione nel motore di database. Per altre informazioni, vedere Hint per le query.

Esempi

Gli esempi di codice Transact-SQL in questo articolo usano il AdventureWorks2022 database di esempio o AdventureWorksDW2022 , che è possibile scaricare dalla home page degli esempi di Microsoft SQL Server e dei progetti della community.

R. Utilizzare una clausola OPTION con una clausola GROUP BY

Nell'esempio seguente viene illustrato l'utilizzo della clausola OPTION con una clausola 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

Esempi: Azure Synapse Analytics e Piattaforma di strumenti analitici (PDW)

B. Istruzione SELECT con un'etichetta nella clausola OPTION

L'esempio seguente mostra un'istruzione di Azure Synapse Analytics SELECT con un'etichetta nella OPTION clausola .

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

C. Istruzione SELECT con un hint per la query nella clausola OPTION

Nell'esempio seguente viene illustrata un'istruzione SELECT che usa un HASH JOIN hint per la query nella OPTION clausola .

-- Uses AdventureWorks

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

D. Istruzione SELECT con un'etichetta e più hint per la query nella clausola OPTION

L'esempio seguente è un'istruzione di Azure Synapse Analytics SELECT che contiene un'etichetta e più hint per la query. Quando la query viene eseguita nei nodi di calcolo, SQL Server applica un hash join o un merge join, in base alla strategia che SQL Server decide è il più ottimale.

SELECT COUNT(*) FROM dbo.DimCustomer a
INNER JOIN dbo.FactInternetSales b
    ON (a.CustomerKey = b.CustomerKey)
OPTION (Label = 'CustJoin', HASH JOIN, MERGE JOIN);

E. Utilizzare un hint per la query quando si eseguono query di una vista

Nell'esempio seguente viene creata una vista denominata CustomerView e quindi viene usato un HASH JOIN hint di query in una query che fa riferimento a una vista e a una tabella.

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. Query con un'istruzione sub-SELECT e un hint per la query

Nell'esempio seguente viene illustrata una query che contiene un'istruzione sub-SELECT e un hint per la query. L'hint per la query viene applicato a livello globale. Non è possibile aggiungere hint di query all'istruzione subselect.

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. Forzare l'ordine di join in modo che corrisponda a quello della query

Nell'esempio seguente viene usato l'hint FORCE ORDER per forzare il piano di query a usare l'ordine di join specificato dalla query. Questo hint migliora le prestazioni di alcune query, ma non tutte le query.

Questa query ottiene numeri di partizione, valori limite, tipi di valore limite e righe per limite per le partizioni nella ProspectiveBuyer tabella del ssawPDW database.

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

L'esempio seguente forza il pushdown della WHERE clausola al processo MapReduce nella tabella Hadoop esterna.

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

Nell'esempio seguente viene impedito il pushdown della WHERE clausola al processo MapReduce nella tabella Hadoop esterna. Tutte le righe vengono restituite a PDW in cui viene applicata la WHERE clausola .

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

I. Eseguire query sui dati a partire da un punto nel tempo

Si applica a: magazzino in Microsoft Fabric

Per altre informazioni, vedere Hint per le query FOR TIMESTAMP.

Usare la sintassi TIMESTAMP nella formula OPTION per eseguire query sui dati esistenti in passato, in Synapse Data Warehouse in Microsoft Fabric. La seguente query di esempio restituisce i dati visualizzati il 13 marzo 2024 alle 7:39:35.28 UTC. Il fuso orario è sempre in formato 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