Los usuarios de SQL Server usan el término "sargable" . Me pregunto si existe una definición atemporal objetiva e independiente de la implementación para "sargable".
Por ejemplo, WHERE foo LIKE '%bar%'
muchos dicen que no son modificables , pero algunos RDBMS pueden usar índices en tales consultas . ¿Qué significa entonces "no sargable" ?
Otras referencias
terminology
Evan Carroll
fuente
fuente
Respuestas:
El término "sargable" fue introducido por primera vez por P. Griffiths Selinger et al. en su artículo de 1979 "Selección de ruta de acceso en un sistema de gestión de bases de datos relacionales", publicado por ACM . Para los que no son miembros de ACM hay una copia de ese documento en http://cs.stanford.edu/people/chrismre/cs345/rl/selinger.pdf
El término se define en este párrafo:
En otras palabras, un predicado sargable es tal que puede ser resuelto por el motor de almacenamiento (método de acceso) observando directamente la tabla o el registro de índice. Un predicado no sargable, por el contrario, requiere un nivel superior del DBMS para tomar medidas. Por ejemplo, el
WHERE lastname = 'Doe'
motor de almacenamiento puede decidir el resultado de simplemente mirando el contenido del campolastname
de cada registro. Por otro lado,WHERE UPPER(lastname) = 'DOE'
requiere la ejecución de una función por el motor SQL, lo que significa que el motor de almacenamiento tendrá que devolver todas las filas que lee (siempre que coincidan con otros posibles predicados sargable) al motor SQL para su evaluación, incurriendo en costos adicionales de CPU .Puede ver en la definición original que los predicados sargable pueden aplicarse no solo a los escaneos de índice, sino también a los escaneos de tabla (segmento en la terminología del Sistema R), siempre que se cumplan las condiciones "valor de operador de comparación de columna" y, por lo tanto, se puedan cumplir evaluado por el motor de almacenamiento. De hecho, este es el caso con Db2, un descendiente del Sistema R de muchas maneras :
El hecho de que en SQL Server-speak los predicados sargable son solo aquellos que pueden resolverse mediante búsquedas de índice probablemente esté determinado por la incapacidad de su motor de almacenamiento para aplicar dichos predicados durante los escaneos de tablas.
Los predicados sargable y no sargable a veces se describen como predicados "etapa 1" y "etapa 2" respectivamente (esto también proviene de la terminología Db2 ). Los predicados de la etapa 1 se pueden evaluar en el nivel más bajo de procesamiento de consultas, mientras se leen registros de tablas o índices. Las filas que coinciden con las condiciones de la etapa 1, si las hay, se envían al siguiente nivel, etapa 2, de evaluación.
1 - El segmento en el Sistema R es el almacenamiento físico de las tuplas de una tabla; una exploración de segmento es algo equivalente a una exploración de tabla en otros DBMS.
2 - RSI - RSS 3 Interface, una interfaz de consulta orientada a tuplas. La función de interfaz relevante para esta discusión es NEXT, que devuelve los predicados de consulta de coincidencia de la siguiente fila.
3 - RSS, o Research Storage System, el subsistema de almacenamiento del Sistema R.
fuente
= UPPER()
es una llamada a la función, pero también lo esmemcmp
por sí misma. Sería relativamente fácil escribir unmemcmp
que asuma ASCII e ignore el caso (solo mire el segundo mordisco). ¿Eso lo hace SARGABLE? Vea también el ejemplo de @ Ypercube, dba.stackexchange.com/questions/162263/…x=0
SARGable? ¿Qué pasa con-0 = +0
,' ' = ''
o la igualdad espacial? ¿Cuál sería un ejemplo de algo que fuera SARGable, seguro? Cuando dice "sin recurrir a las funciones de la base de datos implementadas fuera del motor de almacenamiento" , está incluido en el ejemplo de YpercubeDATE()
que se incluye dentro del motor de almacenamiento. ¿Por qué no es SARGable por sí mismo?DATE()
no es una función real (SQL Server), pero (supuse) la taquigrafía del Sr. Cube para una conversión de tipo. También podemos discutir esto en el chat si lo desea.Para mí, SARGable significa que SQL Server puede realizar una búsqueda de índice utilizando sus predicados de búsqueda.
No puede decir simplemente que el DBMS puede "aprovechar" un índice, porque con un predicado no compatible, SQL Server puede terminar escaneando un índice no agrupado.
fuente
De acuerdo con Pro SQL Server Internals por Dmitri Korotkevitch :
Ejemplo :
Demo :
Ahora corremos:
Los resultados son:
Veamos las propiedades de la consulta SARGable (Index Seek)
El optimizador de consultas puede definir un límite en el índice de inicio y fin. Tiene un argumento de búsqueda para consultar.
Ahora la consulta no SARGable:
Puede ver que con el comienzo del predicado '% non ..%' no permite que el optimizador de consultas DEFINE un inicio y final o rango en el índice. Ahora debe buscar en toda la tabla (escaneo).
fuente
WHERE name like '%non-SARGable%'
¿eso hace que la condición sea modificable? Y, si es así, ¿no estamos hablando de un inconveniente de implementación específico? IE., ¿No deberíamos decir "no sargable a partir de SQL Server 2016"WHERE DATE(datetime_column) = '2001-01-01'
por ejemplo, es "sargable" (buscará el índice) en las versiones más nuevas de SQL Server (2008+, creo) pero no en las más antiguas.