Filter, Compute Scalar y Top

No todos los operadores buscan datos o relacionan tablas. Algunos reciben un flujo ya producido y lo transforman: descartan filas, calculan una columna o detienen la entrega cuando alcanzan un límite.

Estos operadores suelen ser pequeños dentro del dibujo, pero ayudan a reconstruir qué ocurrió entre la lectura inicial y el resultado. Su presencia describe trabajo; no demuestra por sí sola un problema.

Esquema conceptual de Index Scan, Compute Scalar, Filter y Top dentro de un flujo

Cómo abrir los planes de esta entrada

Activa Include Actual Execution Plan con Ctrl+M y ejecuta cada consulta por separado. Después abre Execution plan. Coloca el puntero sobre el operador que quieres revisar o selecciónalo y presiona F4; Defined Values, Predicate y las cantidades de filas aparecen en la información emergente o en Properties, según el operador.

La pestaña Results muestra las filas devueltas. La captura de cada apartado corresponde a Execution plan, no a una cuadrícula adicional producida por el SELECT.

Compute Scalar: producir un valor calculado

Compute Scalar evalúa una expresión y agrega su resultado al flujo. Una expresión combina valores, operadores y funciones para producir un valor nuevo; puede ser una multiplicación, una conversión o una condición.

Esta consulta calcula un total con impuesto para las primeras diez filas:

SELECT TOP (10)
    p.IdPedido,
    p.Total,
    p.Total * CONVERT(DECIMAL(5, 2), 1.16) AS TotalConImpuesto
FROM dbo.PedidoLaboratorio AS p
ORDER BY p.IdPedido;

El plan compilado contiene Clustered Index Scan, Compute Scalar y Top. En las propiedades de Compute Scalar, Defined Values muestra la expresión y el nombre interno del valor que produce.

Plan real con Compute Scalar y Top

  1. 1
    Valor calculado

    Compute Scalar agrega TotalConImpuesto al flujo; la expresión concreta se comprueba en Defined Values.

  2. 2
    Límite de filas

    Top entrega diez filas. El orden por IdPedido determina cuáles ocupan esas primeras posiciones.

La ubicación del icono no garantiza que todo el cálculo ocurra exactamente en ese punto. SQL Server puede diferir una expresión hasta que otro operador necesite el valor; por eso algunos planes no muestran filas ni tiempo propios para Compute Scalar. Primero comprobamos la expresión y quién consume su resultado.

Top: limitar el flujo

Top entrega una cantidad limitada de filas y deja de solicitarlas cuando alcanza ese límite. El operador puede provenir de TOP, de una paginación o de una transformación que permite establecer un límite temprano.

En la consulta anterior, ORDER BY p.IdPedido define cuáles son las primeras diez filas. Sin un orden determinista, TOP (10) limita la cantidad, pero no identifica por sí solo qué diez filas deben conservarse.

En sus propiedades conviene revisar:

  • Top Expression, que contiene el límite;
  • Is Percent, que distingue una cantidad de un porcentaje;
  • With Ties, cuando el límite conserva empates del orden indicado.

Un límite también puede influir en las alternativas consideradas por el optimizador. Eso no convierte cada Top en una mejora: debemos comprobar qué filas se pidieron y si existe un orden que las identifique.

Filter: conservar las filas que cumplen un predicado

Filter recibe filas y evalúa un predicado, una expresión cuyo resultado decide si cada fila continúa o se descarta. Un filtro escrito en WHERE no siempre produce un icono Filter: cuando es posible, la condición puede integrarse en el operador que lee los datos.

Para observarlo de forma separada, esta consulta calcula una posición y después conserva las filas 11 a 20:

SELECT
    q.IdPedido,
    q.Total,
    q.Posicion
FROM
(
    SELECT
        p.IdPedido,
        p.Total,
        ROW_NUMBER() OVER (ORDER BY p.IdPedido) AS Posicion
    FROM dbo.PedidoLaboratorio AS p
) AS q
WHERE q.Posicion BETWEEN 11 AND 20;

ROW_NUMBER produce la posición antes de que Filter pueda evaluarla. En el plan compilado aparecen Segment y Sequence Project para construir la secuencia; la siguiente entrada explica esos operadores. También aparece Top, porque el límite superior permite detener la numeración después de la fila 20.

Plan real con Filter, Top, Sequence Project y Segment

  1. 1
    Condición aplicada

    Filter conserva las posiciones entre 11 y 20. La condición concreta aparece en Predicate.

  2. 2
    Posición calculada

    Sequence Project agrega el valor producido por ROW_NUMBER.

  3. 3
    Un solo grupo

    Segment prepara la señal que utiliza la secuencia; al no existir PARTITION BY, todas las filas pertenecen al mismo grupo lógico.

  4. 4
    Detención anticipada

    Top permite detener la numeración al alcanzar la posición 20; después Filter descarta las primeras diez.

La propiedad Predicate de Filter muestra la condición aplicada. Para conocer su efecto comparamos las filas recibidas con las entregadas. Una diferencia grande describe selectividad en ese punto, pero todavía no explica si la lectura anterior pudo evitarse.

El mismo predicado puede aparecer en otro operador

Cuando una condición se puede evaluar durante un Index Seek, aparece como parte de Seek Predicates. Si se evalúa mientras un Scan recorre filas, puede aparecer como Predicate dentro del propio acceso. El icono Filter se reserva para los casos donde el plan necesita un operador separado.

Por eso no buscamos el icono para decidir si una consulta filtra. Seguimos la condición desde el SQL hasta la propiedad donde el plan la colocó y comparamos filas leídas, recibidas y entregadas.

Qué revisar en el plan

Operador Propiedad inicial Pregunta siguiente
Compute Scalar Defined Values ¿Qué expresión produce y dónde se utiliza?
Top Top Expression y orden disponible ¿Qué filas forman el límite?
Filter Predicate y filas de entrada/salida ¿La condición pudo aplicarse durante el acceso?

Qué conclusión todavía no permite obtener

Un Compute Scalar no es costoso solo porque calcule una expresión; Top no garantiza una lectura pequeña; y Filter no demuestra que faltó un índice. El costo depende de cuántas filas llegan, cuántas veces se ejecuta el operador y qué trabajo ocurrió antes.

La siguiente lectura debe conservar el resultado correcto y relacionar estos operadores con el orden, las estimaciones y las propiedades observadas.

Siguiente comprobación razonable

Continúa con Nested Loops, Hash Match y Merge Join para reconocer cómo dos entradas se convierten en un solo flujo.

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