varias - ¿Importa el orden de las cláusulas where en SQL?
where con 3 condiciones sql (6)
Digamos que tengo una tabla llamada PEOPLE
tiene 3 columnas ID, LastName, FirstName
, ninguna de estas columnas está indexada.
LastName
es más único, y FirstName
es menos único.
Si hago 2 búsquedas:
select * from PEOPLE where FirstName="F" and LastName="L"
select * from PEOPLE where LastName="L" and FirstName="F"
Mi creencia es que la segunda es más rápida porque el criterio más único ( LastName
) es lo primero en la cláusula where
, y los registros serán eliminados de manera más eficiente. No creo que el optimizador sea lo suficientemente inteligente como para optimizar el primer sql.
Es mi entendimiento correcto?
ANSI SQL Draft 2003 5WD-01-Framework-2003-09.pdf
6.3.3.3 Orden de evaluación de reglas
...
Cuando la precedencia no está determinada por los Formatos o por paréntesis, la evaluación efectiva de las expresiones generalmente se realiza de izquierda a derecha. Sin embargo, dependerá de la implementación si las expresiones se evalúan realmente de izquierda a derecha, particularmente cuando los operandos u operadores pueden provocar la elevación de condiciones o si los resultados de las expresiones se pueden determinar sin evaluar completamente todas las partes de la expresión.
copiado de here
Declaración OP original
Mi creencia es que la segunda es más rápida porque el criterio más único (Apellido) es lo primero en> la cláusula where, y los registros serán eliminados de manera más eficiente. No creo que el optimizador sea lo suficientemente inteligente como para optimizar el primer sql.
Supongo que está confundiendo esto con la selección del orden de las columnas al crear los índices donde tiene que poner las columnas más selectivas primero que las segundas más selectivas, y así sucesivamente.
Por cierto, para las dos consultas anteriores, el optimizador de servidor SQL no hará ninguna optimización, pero utilizará el plan Trivila siempre que el costo total del plan sea inferior al costo de umbral de paralelismo.
El orden de las cláusulas WHERE no debería marcar la diferencia en una base de datos que cumpla con el estándar SQL. El orden de evaluación no está garantizado en la mayoría de las bases de datos.
No piense que SQL se preocupa por el orden. Lo siguiente genera un error en SQL Server:
select *
from INFORMATION_SCHEMA.TABLES
where ISNUMERIC(table_name) = 1 and CAST(table_name as int) <> 0
Si la primera parte de esta cláusula se ejecutó primero, solo los nombres de la tabla numérica se convertirán en enteros. Sin embargo, falla, proporcionando un claro ejemplo de que SQL Server (como con otras bases de datos) no se preocupa por el orden de las cláusulas en la instrucción WHERE.
Es cierto hasta donde llega, suponiendo que los nombres no están indexados. Sin embargo, diferentes datos lo harían mal. Para saber qué camino hacer, que podría diferir cada vez, el DBMS tendría que ejecutar una consulta de recuento distinta para cada columna y comparar los números, lo que costaría más que simplemente encogerse de hombros y continuar con ello.
No, ese orden no importa (o al menos: no debería importar).
Cualquier optimizador de consultas decente examinará todas las partes de la cláusula WHERE
y descubrirá la forma más eficiente de satisfacer esa consulta.
Sé que el optimizador de consultas de SQL Server seleccionará un índice adecuado, sin importar en qué orden tenga sus dos condiciones. Supongo que otros RDBMS tendrán estrategias similares.
¡Lo que importa es si tienes o no un índice adecuado para esto!
En el caso de SQL Server, es probable que use un índice si tiene:
- un índice en
(LastName, FirstName)
- un índice en
(FirstName, LastName)
- un índice en just
(LastName)
, o just(FirstName)
(o ambos)
Por otro lado, nuevamente para SQL Server, si usa SELECT *
para tomar todas las columnas de una tabla, y la tabla es bastante pequeña, entonces hay una buena posibilidad de que el optimizador de consultas simplemente haga un escaneo de tabla (o índice agrupado) en su lugar de usar un índice (porque la búsqueda en la página de datos completa para obtener todas las otras columnas simplemente se vuelve muy costosa muy rápidamente).
No, todos los RDBM primero comienzan analizando la consulta y optimizándola reordenando su cláusula where.
Dependiendo de qué RDBM está usando, puede mostrar el resultado del análisis (buscar el plan de explicación en Oracle, por ejemplo)
METRO.