Por definición (al menos por lo que he visto) sargable significa que una consulta es capaz de hacer que el motor de consulta optimice el plan de ejecución que utiliza la consulta. He intentado buscar las respuestas, pero no parece haber mucho sobre el tema. Entonces la pregunta es, ¿qué hace o no que una consulta SQL sea sargable? Cualquier documentación sería muy apreciada.
Para referencia: SARGable
sql-server
performance
DForck42
fuente
fuente
Respuestas:
Lo más común que hará que una consulta no sea sargable es incluir un campo dentro de una función en la cláusula where:
El optimizador de SQL no puede usar un índice en myDate, incluso si existe uno. Literalmente tendrá que evaluar esta función para cada fila de la tabla. Mucho mejor de usar:
Algunos otros ejemplos:
fuente
GROUP BY
Incluir una función dentro de hará que una consulta se vuelva no sargable?WHERE ((FullName = 'Ed Jones') OR (FullName IS NULL))
beSELECT... FROM ... WHERE FullName = 'Ed Jones' UNION SELECT...FROM...WHERE FullName IS NULL
? Un chico de optimización me dijo una vez que usar OR en la cláusula where puede desviar consultas ...Select ... WHERE isNull(FullName,'Ed Jones') = 'Ed Jones'
ySelect ... WHERE ((FullName = 'Ed Jones') OR (FullName IS NULL))
. Ambos usan el índice en FullName y realizan una búsqueda de índice.No hagas esto:
Eso provoca una exploración de tabla / índice, porque el valor LIKE comienza con un carácter comodín.
No hagas esto:
Eso causa una exploración de tabla / índice.
El servidor de la base de datos tendrá que evaluar FUNCTION () contra cada fila de la tabla y luego compararlo con 'BLAH'.
Si es posible, hazlo a la inversa:
Esto ejecutará INVERSE_FUNCTION () contra el parámetro una vez y aún permitirá el uso del índice.
fuente
En esta respuesta, supongo que la base de datos tiene suficientes índices de cobertura. Hay suficientes preguntas sobre este tema .
Muchas veces la sargabilidad de una consulta está determinada por el punto de inflexión de los índices relacionados. El punto de inflexión define la diferencia entre buscar y escanear un índice al unir una tabla o conjunto de resultados en otra. Una búsqueda es, por supuesto, mucho más rápida que escanear una tabla completa, pero cuando tiene que buscar muchas filas, una exploración podría tener más sentido.
Entonces, entre otras cosas, una instrucción SQL es más modificable cuando el optimizador espera que el número de filas resultantes de una tabla sea menor que el punto de inflexión de un posible índice en la tabla siguiente.
Puede encontrar una publicación detallada y un ejemplo aquí .
fuente
Para que una operación se considere sargable, no es suficiente que solo pueda usar un índice existente. En el ejemplo anterior, agregar una llamada de función contra una columna indexada en la cláusula where, probablemente tomaría ventaja del índice definido. "Escaneará", también conocido como recuperar todos los valores de esa columna (índice) y luego eliminar los que no coinciden con el valor del filtro proporcionado. Todavía no es lo suficientemente eficiente para tablas con un alto número de filas. Lo que realmente define la sargabilidad es la capacidad de consulta para atravesar el índice b-tree utilizando el método de búsqueda binaria que se basa en la eliminación de medio conjunto para la matriz de elementos ordenados. En SQL, se mostraría en el plan de ejecución como una "búsqueda de índice".
fuente