de Martin LE TARNEC.

Distinguir los accesos de acceso y de filtro


La base de datos SQL usa tres diferentes métodos para aplicar el filtro where (predicados):

Predicado de acceso (“Seek Predicates”)

Los predicados de acceso expresan las condiciones de inicio y de fin del recorrido del nodo hoja.

Predicado de filtro sobre índice (“Predicados” o “where” para las operaciones de índice)

Los predicados de filtro sobre índice se aplican únicamente durante el recorrido del nodo hoja. No contribuyen a las condiciones de inicio y de fin y no limitan el rango escaneado.

Predicado de filtro a nivel de tabla (“where” para las operaciones de tabla)

Los predicados sobre columnas que no son parte del índice se evalúan a nivel de tabla. Para que eso suceda, la base de datos debe cargar la fila desde el heap de la primera tabla.

La siguiente sección explica cómo identificar los predicados de filtro dentro de los planes de ejecución de SQL Server. Se basa en el ejemplo usado para demostrar el impacto de los predicados de filtro sobre Índice en el Capítulo 3. El apéndice tiene todos los scripts para poblar la tabla.

CREATE TABLE scale_data (
   section NUMERIC NOT NULL,
   id1     NUMERIC NOT NULL,
   id2     NUMERIC NOT NULL
)
CREATE INDEX scale_slow ON scale_data(section, id1, id2)

La sentencia de ejemplo selecciona por SECTION e ID2:

SELECT count(*)
  FROM scale_data
 WHERE section = @sec
   AND id2 = @id2

Planes de ejecución de forma gráfica

El plan de ejecución de forma gráfica oculta la información de predicados dentro de la información de la herramienta que se muestra únicamente cuando se mueve el ratón sobre la operación Index Seek. Pasar el ratón por encima del icono Index Seek para ver la información de predicado.

Seek Predicates de SQL Server es equivalente a los predicados de acceso de Oracle; no limita el recorrido del nodo hoja. Los predicados de filtro son etiquetados como Predicates sólo dentro de la forma gráfica del plan de ejecución SQL Server.

Planes de ejecución de forma tabular

Los planes de ejecución de forma tabular tienen la información de predicado en la misma columna, por lo que sí aparecen las operaciones. De ahí que sea muy fácil copiar y pegar toda la información relevante de una sola vez.

DECLARE @sec numeric
DECLARE @id2 numeric
SET STATISTICS PROFILE ON
SELECT count(*)
  FROM scale_data
 WHERE section = @sec
   AND id2 = @id2
SET STATISTICS PROFILE OFF

El plan de ejecución se muestra como un segundo conjunto del resultado dentro de la ventana de resultados. Lo siguiente se ubica en la columna StmtText con un pequeño reformateo para una mejor lectura:

|--Compute Scalar(DEFINE:([Expr1004]=CONVERT_IMPLICIT(...))
     |--Stream Aggregate(DEFINE:([Expr1008]=Count(*)))
          |--Index Seek(OBJECT:([scale_data].[scale_slow]),
             SEEK: ([scale_data].[section]=[@sec])
                    ORDERED FORWARD
             WHERE:([scale_data].[id2]=[@id2]))

La etiqueta SEEK presenta los predicados de acceso y la etiqueta WHERE señala los predicados de filtro.

Sugerencia

Acerca del autor

Foto de Markus Winand

Markus Winand enseña SQL eficiente, en casa y online. Mejora el tiempo de desarrollo utilizando SQL moderno y optimiza el tiempo de ejecución con indexación inteligente. Su libro Rendimiento SQL explicado se ha convertido en lectura obligada sobre el tema.

Adquiere tu libro en Amazon

Portada de “Rendimiento SQL explicado”: Ardilla corriendo en la hierba

La esencia del tuning de SQL en 200 páginas

Compra en Amazon
(solo en papel)

Libro y PDF también disponible en la tienda de Markus.

Contratar a Markus

La manera más rápida y fácil de beneficiarse de su extenso conocimiento y experiencia.
Aprende más »

“Use The Index, Luke” de Markus Winand se halla bajo licencia Creative Commons Attribution-Noncommercial-No Derivative Works 3.0 Unported License.
Aspectos legales | Contacto | SIN GARANTÍA | Marcas | Privacy | CC-BY-NC-ND 3.0 licencia