Sort, Segment y Sequence Project

Una función de ventana conserva cada fila y agrega un valor calculado sobre filas relacionadas. Para producir una numeración por grupo, el plan necesita ordenar el flujo, reconocer dónde cambia cada grupo y mantener el estado de la secuencia.

Sort, Segment y Sequence Project pueden aparecer juntos para realizar esas tres tareas. Ninguno describe por sí solo toda la función escrita en la consulta.

La consulta define grupos y orden

Esta consulta numera los pedidos dentro de cada estado. PARTITION BY reinicia la numeración cuando cambia Estado; ORDER BY define la secuencia dentro del grupo.

Antes de ejecutar, activa Include Actual Execution Plan con Ctrl+M. Al terminar abre Execution plan y sigue la rama desde Sort hacia Segment y Sequence Project. Si un índice ya entrega el orden requerido, SQL Server puede omitir Sort; por eso conviene comprobar el plan real en lugar de buscar siempre los tres nombres.

SELECT
    p.IdPedido,
    p.Estado,
    p.FechaPedido,
    ROW_NUMBER() OVER
    (
        PARTITION BY p.Estado
        ORDER BY p.FechaPedido, p.IdPedido
    ) AS Posicion
FROM dbo.PedidoLaboratorio AS p
OPTION (MAXDOP 1, RECOMPILE);

Una función de ventana calcula un valor sobre un conjunto relacionado sin reducirlo a una fila por grupo. La partición delimita esos conjuntos; el orden de la ventana indica cómo recorrer cada uno.

Sort: preparar el orden requerido

Sort recibe filas y las entrega ordenadas por una o varias expresiones. En este caso necesita producir el orden compuesto por Estado, FechaPedido e IdPedido.

Plan real con Sort antes de Segment y Sequence Project

  1. 1
    Ordenamiento

    Sort organiza las filas antes de que la secuencia pueda calcularse.

  2. 2
    Límite de cada partición

    Segment reconoce cuándo cambia Estado y marca el inicio del grupo siguiente.

  3. 3
    Valor de la secuencia

    Sequence Project utiliza esa marca y agrega la posición calculada por ROW_NUMBER.

El orden también puede provenir de un índice. Para comprobar si fue necesario producirlo, seguimos la rama de entrada: si no aparece Sort, revisamos Ordered y las llaves del acceso anterior en lugar de asumir que la función dejó de necesitar orden.

Sort suele solicitar una concesión de memoria. Las propiedades Order By, filas observadas, memoria concedida y advertencias indican qué se ordenó y si el trabajo permaneció en memoria.

Segment: marcar el comienzo de cada grupo

Segment compara las columnas de segmentación entre filas consecutivas y marca el inicio de un grupo nuevo. No reúne las filas ni calcula el número: conserva el flujo y agrega la señal que necesita el operador siguiente.

La propiedad Group By muestra las columnas utilizadas para detectar el cambio. En esta consulta, Estado define el límite de cada partición. Si no hubiera PARTITION BY, todas las filas pertenecerían a un solo grupo lógico para la numeración.

La entrada debe llegar en un orden que mantenga juntas las filas del grupo. Por eso Segment se interpreta con el orden producido o conservado por la rama anterior.

Sequence Project: agregar el valor de secuencia

Sequence Project calcula una o varias expresiones que dependen del orden y del estado mantenido mientras avanzan las filas. En este caso produce el valor de ROW_NUMBER.

La propiedad Defined Values permite localizar la columna interna que agrega. El operador recibe la marca de Segment, incrementa la secuencia para cada fila y la reinicia cuando comienza otra partición.

No es una agregación: entrega las mismas filas que recibe, ahora con una columna calculada. Tampoco decide el orden; utiliza el que ya preparó la entrada.

Leer los tres operadores como una cadena

Paso Recibe Produce
Sort Filas sin el orden requerido Filas ordenadas por partición y secuencia
Segment Filas ordenadas Una marca cuando comienza otro grupo
Sequence Project Filas y marcas de grupo Las mismas filas con el valor de ventana

Primero confirmamos las columnas del orden. Después comprobamos qué columna delimita el grupo. Al final identificamos el valor definido por Sequence Project. Esa lectura evita atribuir toda la función al icono más visible.

Qué conclusión todavía no permite obtener

La presencia de estos operadores no demuestra que la consulta esté mal diseñada. El orden y la numeración pueden ser indispensables para el resultado. Un índice diferente podría evitar un Sort, pero también agregar almacenamiento y costo de escritura.

Para evaluar el impacto necesitamos filas, memoria, posibles derrames, frecuencia de ejecución y alternativas que conserven el mismo resultado.

Siguiente comprobación razonable

Continúa con Stream Aggregate y Hash Match (Aggregate) para distinguir dos mecanismos que sí convierten varias filas en un resultado por grupo.

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