Compartir vía


Cláusula OPTION (Transact-SQL)

Se aplica a:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)Punto de conexión de análisis SQL en Microsoft FabricAlmacenamiento en Microsoft Fabric

Especifica que en toda la consulta se debe utilizar la sugerencia de consulta especificada. Solo se puede especificar cada sugerencia de consulta una vez, aunque se permiten varias sugerencias de consulta. Solo se puede especificar una cláusula OPTION con la instrucción.

Esta cláusula se puede especificar en las instrucciones SELECT, DELETE, UPDATE y MERGE.

Convenciones de sintaxis de Transact-SQL

Sintaxis

Sintaxis para SQL Server, Azure SQL Instancia administrada y Azure SQL Database:

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

Sintaxis para Warehouse en 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>'

Sintaxis de Azure Synapse Analytics and Analytics Platform System (PDW) y punto de conexión de sql Analytics en 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

Sintaxis del grupo de SQL sin servidor en Azure Synapse Analytics:

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

<query_option> ::=
    LABEL = label_name

Nota:

Para ver la sintaxis de Transact-SQL para SQL Server 2014 (12.x) y versiones anteriores, consulte Versiones anteriores de la documentación.

Argumentos

query_hint

Palabras clave que indican qué sugerencias del optimizador se emplean para personalizar la forma en que el Motor de base de datos procesa la instrucción. Para más información, consulte Sugerencias de consultas.

Ejemplos

Los ejemplos de código de Transact-SQL de este artículo utilizan la base de datos de ejemplo AdventureWorks2022 o AdventureWorksDW2022, que se pueden descargar desde la página principal de Ejemplos y proyectos de la comunidad de Microsoft SQL Server.

A Usar una cláusula OPTION con una cláusula GROUP BY

En el ejemplo siguiente se muestra cómo se usa la cláusula OPTION con una 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

Ejemplos: Azure Synapse Analytics y Sistema de la plataforma de análisis (PDW)

B. Instrucción SELECT con una etiqueta en la cláusula OPTION

En el ejemplo siguiente se muestra una instrucción de Azure Synapse Analytics SELECT con una etiqueta en la OPTION cláusula .

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

C. Instrucción SELECT con una sugerencia de consulta en la cláusula OPTION

En el ejemplo siguiente se muestra una SELECT instrucción que usa una HASH JOIN sugerencia de consulta en la 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. Instrucción SELECT con una etiqueta y varias sugerencias de consulta en la cláusula OPTION

El ejemplo siguiente es una instrucción de Azure Synapse Analytics SELECT que contiene una etiqueta y varias sugerencias de consulta. Cuando la consulta se ejecuta en los nodos de proceso, SQL Server aplica una combinación hash o combinación de mezcla, según la estrategia que SQL Server decide es la más óptima.

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 una sugerencia de consulta al consultar a una vista

En el ejemplo siguiente se crea una vista denominada CustomerView y, a continuación, se usa una HASH JOIN sugerencia de consulta en una consulta que hace referencia a una vista y una tabla.

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 con una subselección y una sugerencia de consulta

En el ejemplo siguiente se muestra una consulta que contiene una subselección y una sugerencia de consulta. La sugerencia de consulta se aplica de forma global. Las sugerencias de consulta no se pueden anexar a la instrucción 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. Hacer coincidir el orden de combinación con el orden de la consulta

En el ejemplo siguiente se usa la FORCE ORDER sugerencia para forzar que el plan de consulta use el orden de combinación especificado por la consulta. Esta sugerencia mejora el rendimiento de algunas consultas, pero no todas las consultas.

Esta consulta obtiene números de partición, valores de límite, tipos de valores de límite y filas por límite para las particiones de la ProspectiveBuyer tabla de la ssawPDW base de datos.

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

En el ejemplo siguiente se fuerza la inserción de la WHERE cláusula al trabajo de MapReduce en la tabla de Hadoop externa.

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

En el ejemplo siguiente se evita la inserción de la WHERE cláusula en el trabajo de MapReduce en la tabla de Hadoop externa. Todas las filas se devuelven a PDW donde se aplica la WHERE cláusula .

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

I. Consulta de datos a partir de un momento dado

Esto se aplica a: Almacén en Microsoft Fabric

Para obtener más información, consulte la sugerencia de consulta FOR TIMESTAMP.

Use la sintaxis TIMESTAMP de la cláusula OPTION para consultar los datos tal como existía en el pasado, en Synapse Data Warehouse en Microsoft Fabric. La siguiente consulta de ejemplo devuelve datos tal como aparecían el 13 de marzo de 2024 a las 7:39:35.28 UTC. La zona horaria siempre está en 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