Compartilhar via


Cláusula OPTION (Transact-SQL)

Aplica-se a: SQL Server Banco de Dados SQL do Azure Instância Gerenciada de SQL do Azure Azure Synapse Analytics PDW (Analytics Platform System) Ponto de extremidade de análise de SQL no Microsoft Fabric Warehouse no Microsoft Fabric

Especifica que a dica de consulta indicada deve ser usada em toda a consulta. Cada dica de consulta pode ser especificada apenas uma vez, embora sejam permitidas várias dicas de consulta. Apenas uma cláusula OPTION pode ser especificada com a instrução.

Essa cláusula pode ser especificada nas instruções SELECT, DELETE, UPDATE e MERGE.

Convenções de sintaxe de Transact-SQL

Sintaxe

Sintaxe para SQL Server, Instância Gerenciada de SQL do Azure e Banco de Dados SQL do Azure:

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

Sintaxe para Warehouse no 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>'

Sintaxe para o Azure Synapse Analytics e o PDW (Analytics Platform System) e o ponto de extremidade de análise do SQL no 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

Sintaxe para pool de SQL sem servidor no Azure Synapse Analytics:

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

<query_option> ::=
    LABEL = label_name

Observação

Para exibir a sintaxe do Transact-SQL para o SQL Server 2014 (12.x) e versões anteriores, confira a Documentação das versões anteriores.

Argumentos

query_hint

Palavras-chave que indicam as dicas de otimização são usadas para personalizar a forma como o Mecanismo de Banco de Dados processa a instrução. Para saber mais, confira Dicas de consulta.

Exemplos

Os exemplos de código do Transact-SQL deste artigo usa o banco de dados de exemplo AdventureWorks2022 ou AdventureWorksDW2022, que pode ser baixado da home page Microsoft SQL Server Samples and Community Projects.

R. Usar uma cláusula OPTION com uma cláusula GROUP BY

O exemplo a seguir mostra como a cláusula OPTION é usada com uma cláusula 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

Exemplos: Azure Synapse Analytics e PDW (Analytics Platform System)

B. Instrução SELECT com um rótulo na cláusula OPTION

O exemplo a seguir mostra uma instrução do Azure Synapse Analytics SELECT com um rótulo na OPTION cláusula.

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

C. Instrução SELECT com uma dica de consulta na cláusula OPTION

O exemplo a seguir mostra uma SELECT instrução que usa uma HASH JOIN dica de consulta na OPTION cláusula.

-- Uses AdventureWorks

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

D. Instrução SELECT com um rótulo e várias dicas de consulta na cláusula OPTION

O exemplo a seguir é uma instrução do Azure Synapse Analytics SELECT que contém um rótulo e várias dicas de consulta. Quando a consulta é executada nos nós de computação, o SQL Server aplica uma junção de hash ou junção de mesclagem, de acordo com a estratégia que o SQL Server decide ser a mais ideal.

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

E. Usar uma dica de consulta durante a consulta de uma exibição

O exemplo a seguir cria uma exibição chamada CustomerView e, em seguida, usa uma dica de HASH JOIN consulta em uma consulta que faz referência a uma exibição e a uma tabela.

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. Consultar com uma subseleção e dica de consulta

O exemplo a seguir mostra uma consulta que contém uma subseleção e uma dica de consulta. A dica de consulta é aplicada globalmente. As dicas de consulta não podem ser acrescentadas à instrução 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. Forçar a ordem de junção para que ela corresponda à ordem na consulta

O exemplo a seguir usa a FORCE ORDER dica para forçar o plano de consulta a usar a ordem de junção especificada pela consulta. Essa dica melhora o desempenho em algumas consultas, mas não em todas.

Essa consulta obtém números de partição, valores de limite, tipos de valor de limite e linhas por limite para as partições na ProspectiveBuyer tabela do banco de ssawPDW dados.

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

O exemplo a seguir força o WHERE pushdown da cláusula para a tarefa MapReduce na tabela externa do Hadoop.

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

O exemplo a seguir impede a aplicação da WHERE cláusula para a tarefa MapReduce na tabela externa do Hadoop. Todas as linhas são retornadas ao PDW onde a WHERE cláusula é aplicada.

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

I. Consultar dados em um ponto no tempo

Aplica-se a:Depósito no Microsoft Fabric

Para obter mais informações, confira a dica de consulta FOR TIMESTAMP.

Use a sintaxe TIMESTAMP na cláusula OPTION para consultar dados como existiam no passado no Synapse Data Warehouse no Microsoft Fabric. A consulta de amostra a seguir retorna dados como apareciam em 13 de março de 2024 às 19h39min35,28s UTC. O fuso horário é sempre em 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