Estoy tratando de ajustar el rendimiento de una consulta que tenemos en SQL Server 2014 Enterprise.
He abierto el plan de consulta real en SQL Sentry Plan Explorer y puedo ver en un nodo que tiene un predicado de búsqueda y también un predicado
¿Cuál es la diferencia entre Seek Predicate y Predicate ?
Nota: Puedo ver que hay muchos problemas con este nodo (por ejemplo, las filas Estimadas vs Reales, el IO residual), pero la pregunta no se relaciona con nada de eso.
The Seek Predicate can be used to find the start of the RangeScan and then when to stop, while the Predicate is the "check" that is applied to every row in the Range.
Respuestas:
Arrojemos un millón de filas en una tabla temporal junto con algunas columnas:
Aquí tengo un índice agrupado (por defecto) en la
PK
columna. Hay un índice no agrupadoCOL1
que tiene una columna clave deCOL1
e incluyeCOL2
.Considere la siguiente consulta:
Aquí no estoy usando
BETWEEN
porque Aaron Bertrand está dando vueltas a esta pregunta.¿Cómo debe optimizar SQL Server esa consulta? Bueno, sé que el filtro
PK
activado reducirá el conjunto de resultados a cinco filas. El servidor SQL puede usar el índice agrupado para saltar a esas cinco filas en lugar de leer todos los millones de filas de la tabla. Sin embargo, el índice agrupado solo tiene la columna PK como una columna clave. Una vez que la fila se lee en la memoria, debemos aplicar el filtroCOL2
. Aquí,PK
es un predicado de búsqueda yCOL2
es un predicado.El servidor SQL encuentra cinco filas usando el predicado de búsqueda y reduce aún más esas cinco filas a una fila con el predicado normal.
Si defino el índice agrupado de manera diferente:
Y ejecuto la misma consulta obtengo resultados diferentes:
En este caso, SQL Server puede buscar utilizando ambas columnas en la
WHERE
cláusula. Se lee exactamente una fila de la tabla utilizando las columnas clave.Para un ejemplo más, considere esta consulta:
El índice IX_174860_IX es un índice de cobertura porque contiene todas las columnas necesarias para la consulta. Sin embargo, solo
COL1
es una columna clave. SQL Server puede buscar con esa columna para encontrar las 1000 filas con unCOL1
valor coincidente . Puede filtrar aún más esas filas en laCOL2
columna para reducir el conjunto de resultados finales a 0 filas.fuente