Buscar..


ÚNETE a sugerencias

Cuando se unen dos tablas, el optimizador de consultas (QO) de SQL Server puede elegir diferentes tipos de combinaciones que se usarán en la consulta:

  • HASH unirse
  • Loop unirse
  • MERGE unirse

QO explorará los planes y elegirá al operador óptimo para unir tablas. Sin embargo, si está seguro de saber cuál sería el operador de combinación óptimo, puede especificar qué tipo de combinación debe usarse. La combinación interna de LOOP obligará a QO a elegir la combinación de bucle anidado al unir dos tablas:

select top 100 *
from Sales.Orders o 
    inner loop join Sales.OrderLines ol 
    on o.OrderID = ol.OrderID

la unión interna de combinación forzará el operador de combinación de MERGE:

select top 100 *
from Sales.Orders o 
    inner merge join Sales.OrderLines ol 
    on o.OrderID = ol.OrderID

La combinación de hash interno forzará al operador de unión HASH:

select top 100 *
from Sales.Orders o 
    inner hash join Sales.OrderLines ol 
    on o.OrderID = ol.OrderID

GRUPO POR CONSEJOS

Cuando utiliza la cláusula GROUP BY, el optimizador de consultas de SQL Server (QO) puede elegir diferentes tipos de operadores de agrupación:

  • Agregado de HASH que crea un hash-map para agrupar entradas
  • Agregado de flujo que funciona bien con entradas pre-ordenadas

Puede requerir explícitamente que QO elija uno u otro operador agregado si sabe cuál sería el óptimo. Con OPTION (ORDER GROUP), QO siempre elegirá Stream agregate y agregará el operador Sort al frente de Stream agregate si la entrada no está ordenada:

select OrderID, AVG(Quantity)
from Sales.OrderLines
group by OrderID
OPTION (ORDER GROUP) 

Con OPTION (HASH GROUP), QO siempre elegirá el agregado de hash:

select OrderID, AVG(Quantity)
from Sales.OrderLines
group by OrderID
OPTION (HASH GROUP) 

Sugerencia de filas FAST

Especifica que la consulta está optimizada para la recuperación rápida de las primeras number_rows. Este es un entero no negativo. Después de que se devuelven los primeros number_rows, la consulta continúa la ejecución y produce su conjunto de resultados completo.

select OrderID, AVG(Quantity)
from Sales.OrderLines
group by OrderID
OPTION (FAST 20) 

Consejos UNION

Cuando utiliza el operador UNION en dos resultados de consulta, el Optimizador de consultas (QO) puede usar los siguientes operadores para crear una unión de dos conjuntos de resultados:

  • Fusionar (Unión)
  • Concat (Unión)
  • Hash Match (Unión)

Puede especificar explícitamente qué operador se debe usar usando la sugerencia OPTION ():

select OrderID, OrderDate, ExpectedDeliveryDate, Comments
from Sales.Orders
where OrderDate > DATEADD(day, -1, getdate())
UNION
select PurchaseOrderID as OrderID, OrderDate, ExpectedDeliveryDate, Comments
from Purchasing.PurchaseOrders
where OrderDate > DATEADD(day, -1, getdate())
OPTION(HASH UNION)
-- or OPTION(CONCAT UNION)
-- or OPTION(MERGE UNION)

Opción MAXDOP

Especifica el grado máximo de paralelismo para la consulta que especifica esta opción.

SELECT OrderID,
    AVG(Quantity)
FROM Sales.OrderLines
GROUP BY OrderID
OPTION (MAXDOP 2);

Esta opción anula la opción de configuración MAXDOP de sp_configure y Resource Governor. Si MAXDOP se establece en cero, el servidor elige el grado máximo de paralelismo.

INDEX Consejos

Las sugerencias de índice se usan para forzar a una consulta a usar un índice específico, en lugar de permitir que el Optimizador de consultas de SQL Server elija el que considere el mejor índice. En algunos casos, puede obtener beneficios al especificar el índice que debe usar una consulta. Por lo general, el Optimizador de consultas de SQL Server elige el mejor índice adecuado para la consulta, pero debido a estadísticas faltantes / obsoletas o necesidades específicas, puede forzarlo.

SELECT *
FROM mytable WITH (INDEX (ix_date))
WHERE field1 > 0
    AND CreationDate > '20170101'


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow