Stream Aggregate y Hash Match (Aggregate)

GROUP BY expresa que varias filas deben convertirse en un resultado por grupo. El plan todavía debe elegir cómo mantener esos grupos mientras calcula COUNT, SUM u otra agregación.

Dos mecanismos frecuentes son Stream Aggregate, que aprovecha una entrada ordenada, y Hash Match (Aggregate), que construye grupos mediante una tabla hash.

Cómo abrir y distinguir ambos planes

Activa Include Actual Execution Plan con Ctrl+M y ejecuta cada consulta por separado. En Execution plan, localiza el operador cuyo nombre completo termina en (Aggregate). Coloca el puntero sobre él o selecciónalo y presiona F4 para comprobar Physical Operation, Logical Operation, las filas recibidas y las filas entregadas.

Las cuadrículas de Results muestran los grupos calculados; las capturas de esta entrada pertenecen a Execution plan. Los hints ORDER GROUP y HASH GROUP se usan aquí para aislar los mecanismos, no para recomendar que se impongan en una consulta de aplicación.

Agregar significa reducir filas por grupo

Una agregación combina filas y produce un valor resumido. La llave de agrupación contiene las columnas que deciden qué filas pertenecen al mismo grupo.

Los dos operadores de esta entrada realizan ese propósito lógico, pero requieren estructuras diferentes. El nombre físico permite reconstruir qué estrategia eligió SQL Server.

Stream Aggregate: aprovechar el orden

Stream Aggregate recibe filas ordenadas por la llave de agrupación. Mientras la llave permanece igual, acumula el grupo actual; cuando cambia, entrega el resultado y comienza el siguiente.

SELECT
    p.FechaPedido,
    COUNT_BIG(*) AS Pedidos,
    SUM(p.Total) AS TotalAcumulado
FROM dbo.PedidoLaboratorio AS p
GROUP BY p.FechaPedido
OPTION (ORDER GROUP, MAXDOP 1, RECOMPILE);

Plan real con Stream Aggregate y una entrada ordenada por fecha

  1. 1
    Agregación continua

    Stream Aggregate recibe 100,000 filas y entrega 730 grupos, uno por fecha.

  2. 2
    Orden disponible

    El Index Scan recorre un índice cuya llave comienza con FechaPedido; la entrada ya llega en el orden necesario.

Un Index Scan puede leer muchas filas y conservar el orden de la llave del índice. La propiedad Ordered de la entrada y Group By del agregado permiten comprobar la relación. Si el orden no existe, el plan puede producirlo mediante Sort o elegir otra estrategia.

Hash Match (Aggregate): construir grupos por llave

Hash Match (Aggregate) calcula una función hash sobre la llave y utiliza el resultado para localizar el grupo donde acumulará cada fila.

Una función hash transforma una llave en un valor que la dirige a una sección de una estructura. Las coincidencias se confirman con la llave original; el hash organiza la búsqueda, no sustituye la comparación.

SELECT
    p.Estado,
    COUNT_BIG(*) AS Pedidos,
    SUM(p.Total) AS TotalAcumulado
FROM dbo.PedidoLaboratorio AS p
GROUP BY p.Estado
OPTION (HASH GROUP, MAXDOP 1, RECOMPILE);

Plan real con Hash Match Aggregate

  1. 1
    Tabla hash de grupos

    Hash Match (Aggregate) recibe 100,000 filas y entrega cuatro estados.

  2. 2
    Entrada sin orden requerido

    El Index Scan aporta las filas; el agregado no depende de que estén ordenadas por Estado.

La tabla hash requiere memoria. Si la concesión resulta insuficiente, el operador puede dividir el trabajo y utilizar tempdb. El nombre Hash Match no demuestra un derrame: necesitamos una advertencia y las propiedades de la ejecución observada.

Comparar mecanismos sin declarar un ganador

Operador Necesita Conviene comprobar
Stream Aggregate Entrada ordenada por la llave del grupo De dónde proviene el orden y si requiere Sort
Hash Match (Aggregate) Memoria para mantener la tabla hash Filas, concesión y advertencias de derrame

Stream Aggregate no es siempre mejor por parecer más sencillo. Si necesita ordenar un conjunto amplio, ese trabajo forma parte de la estrategia. Hash Match (Aggregate) no es siempre peor por solicitar memoria; puede evitar producir un orden que no existe.

Los hints ORDER GROUP y HASH GROUP se utilizan aquí para aislar ambos mecanismos. OPTION y los query hints` explica por qué no deben conservarse automáticamente en una consulta real.

Qué conclusión todavía no permite obtener

El operador elegido no demuestra por sí solo que una agrupación sea eficiente. Todavía necesitamos medir lecturas, memoria, duración, filas y frecuencia, además de comprobar si el orden o el hash provocaron trabajo adicional.

Tampoco conviene crear un índice solo para retirar un icono. La estructura debe evaluarse contra las demás consultas y contra su costo de almacenamiento y mantenimiento.

Siguiente comprobación razonable

Continúa con Spool: materialización y reutilización para reconocer cuándo el plan conserva un resultado intermedio.

Relacionado con

Índice del recorrido

Planes de ejecución

30 artículos de Planes de ejecución
  1. 01Para qué sirve un plan de ejecución
  2. 02Plan estimado, plan real y estadísticas en vivo
  3. 03Cómo se organiza el árbol de un plan de ejecución
  4. 04Flechas, propiedades y número de ejecuciones
  5. 05Mapa de operadores: qué papel cumple cada nodo
  6. 06Filas estimadas y filas reales
  7. 07Index Seek, Index Scan y Table Scan
  8. 08Key Lookup y trabajo repetido
  9. 09Filter, Compute Scalar y Top
  10. 10Nested Loops, Hash Match y Merge Join
  11. 11Sort, Segment y Sequence Project
  12. 12Stream Aggregate y Hash Match (Aggregate)
  13. 13Spool: materialización y reutilización
  14. 14Parallelism: distribuir, repartir y reunir filas
  15. 15Advertencias del plan que requieren investigación
  16. 16Acciones disponibles en el plan gráfico de SSMS
  17. 17Cómo se organiza el XML Showplan
  18. 18Recorrer Analyze Actual Execution Plan
  19. 19Lecturas con SET STATISTICS IO
  20. 20CPU y duración con SET STATISTICS TIME
  21. 21Construir una línea base repetible
  22. 22Guardar y comparar dos planes
  23. 23Historial y regresiones con Query Store
  24. 24Convertir un escenario de Analyze Actual Execution Plan en una hipótesis
  25. 25Leer una sugerencia Missing Index en el plan
  26. 26Entender el CREATE INDEX generado por SSMS
  27. 27Decidir, crear y comprobar un índice
  28. 28De una consulta lenta a una hipótesis comprobable
  29. 29Evaluar un cambio sin optimizar solo una ejecución
  30. 30Análisis guiado de una consulta empresarial reproducible