Digamos que tengo una tabla llamada que PEOPLE
tiene 3 columnas ID, LastName, FirstName
, ninguna de estas columnas está indexada.
LastName
es más único y FirstName
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"
Creo que el segundo es más rápido porque el criterio más exclusivo ( LastName
) viene primero en la where
cláusula, y los registros se eliminarán de manera más eficiente. No creo que el optimizador sea lo suficientemente inteligente como para optimizar el primer sql.
¿Es correcto mi entendimiento?
sql
performance
where-clause
Ziyang Zhang
fuente
fuente
Respuestas:
No, ese orden no importa (o al menos: no debería importar).
Cualquier optimizador de consultas decente examinará todas las partes de la
WHERE
cláusula y descubrirá la forma más eficiente de satisfacer esa consulta.Sé que el optimizador de consultas de SQL Server elegirá 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 tiene o no un índice adecuado para esto!
En el caso de SQL Server, es probable que use un índice si tiene:
(LastName, FirstName)
(FirstName, LastName)
(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 solo haga un escaneo de tabla (o índice agrupado) en lugar de usar un índice (porque la búsqueda en la página de datos completa para obtener todas las demás columnas se vuelve demasiado costosa muy rápidamente).fuente
WHERE T1.col_1/T2.col_2 > 10 AND T2.col_2 <> 0
y recibí unDIVIDE BY 0
error. Después de cambiar el orden de las condiciones, la consulta se ejecutó con éxito. Luego volví a cambiar la orden, así que esperaría recibir el error nuevamente, ¡pero esta vez funcionó! Al final, mi conclusión fue que, para la primera ejecución, la orden es importante, hasta que se construye el plan de ejecución. 'no importa' porque el plan optimizador / ejecutivo se encargará de elloEl orden de las cláusulas WHERE no debería hacer una 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 a SQL le importa el orden. Lo siguiente genera un error en SQL Server:
Si la primera parte de esta cláusula se ejecutara primero, solo los nombres de tablas numéricas se convertirían como 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.
fuente
ISNUMERIC(table_name) = 1
se evaluó primero,CAST
solo se llamaría para nombres de tablas numéricas. Pero como no se evalúa primero, tambiénCAST
se evalúa para nombres de tabla no numéricos, lo que causa el mensaje de error.ANSI SQL Draft 2003 5WD-01-Framework-2003-09.pdf
6.3.3.3 Orden de evaluación de la regla
...
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, depende de la implementación si las expresiones se evalúan realmente de izquierda a derecha, particularmente cuando los operandos u operadores pueden provocar condiciones o si los resultados de las expresiones se pueden determinar sin evaluar completamente todas las partes de la expresión.
copiado de aquí
fuente
No, todos los RDBM comienzan primero analizando la consulta y optimizándola reordenando su cláusula where.
Dependiendo de qué RDBM que esté utilizando puede mostrar cuál es el resultado del análisis (busque el plan de explicación en Oracle, por ejemplo)
METRO.
fuente
Declaración OP original
Supongo que está confundiendo esto con la selección del orden de las columnas al crear los índices en los que debe colocar las columnas más selectivas primero que la segunda más selectiva, etc.
Por cierto, para las dos consultas anteriores, el optimizador del servidor SQL no realizará ninguna optimización, pero utilizará el plan Trivila siempre que el costo total del plan sea menor que el costo del umbral de paralelismo.
fuente
Es cierto hasta donde llega, suponiendo que los nombres no estén indexados. Sin embargo, diferentes datos lo harían mal. Para descubrir qué forma de hacerlo, 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, que costaría más que simplemente encogerse de hombros y seguir adelante.
fuente