2012-07-11 23 views
75

Digamos que tengo una tabla llamada PEOPLE que tiene 3 columnas ID, LastName, FirstName, ninguna de estas columnas está indexada.
LastName es más único, y FirstName es menos único.¿Importa el orden de las cláusulas where en SQL

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 el segundo es más rápido porque el criterio más único (LastName) es lo primero en la cláusula where y registros conseguirá eliminado de manera más eficiente. No creo que el optimizador sea lo suficientemente inteligente como para optimizar el primer sql.

¿Es correcto mi entendimiento?

+7

No, ese orden no importa: cualquier optimizador de consulta decente observará ** todas ** las cláusulas WHERE y descubrirá la forma más eficiente de satisfacer esa consulta –

+3

¿Cuáles fueron sus observaciones cuando ejecutó estas dos afirmaciones? ¿Cómo se veían los planes de ejecución? –

+3

¿Se refiere a un RDBMS específico? De hecho, hay diferencias. – Bjoern

Respuesta

64

No, ese orden no importa (o al menos: no debería importar).

Cualquier optimizador de consulta decente mirará todos 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 utilice un índice si usted tiene:

  • un índice en (LastName, FirstName)
  • un índice en (FirstName, LastName)
  • un índice en solo (LastName), o simplemente (FirstName) (o ambos)

Por otro lado, de nuevo para SQL Server - si usa SELECT * para obtener todas las columnas de una tabla, y la tabla es bastante pequeña, entonces hay una buena probabilidad de que el optimizador de consultas solo haga una exploración de tabla (o de índice agrupado) en lugar de usar un índice (porque la búsqueda en la página de datos completa para obtener todas otras columnas son muy costosas muy rápidamente).

+0

Si no hay índice (es) op podría estar correcto, según los datos. Por supuesto, hacer algo como esto sin índices sería una decisión extraña ... –

+0

@TonyHopkinson: No lo creo, incluso sin índices dudo que haya alguna diferencia. Después de todo: sin índices, ¿qué otra cosa más que una exploración de tabla completa puede hacer el RDBMS, realmente? –

+2

Nota interesante con el servidor SQL, aparentemente el orden de NO EXISTE dentro de los predicados puede influir en la creación del plan: http://bradsruminations.blogspot.com/2010/04/looking-under-hood.html –

2

No, todos los RDBM primero comienzan analizando la consulta y optimizándola reordenando su cláusula where.

Dependiendo de qué rdbm usted está usando puede mostrar lo que es el resultado del análisis de (buscar explicar el plan de Oracle, por ejemplo)

M.

+0

Lo hace según los índices. Entonces es indirecto en términos de contenido. –

+0

, de hecho, esto se hace principalmente en base a las estadísticas de la tabla – poussma

9

El orden de las cláusulas WHERE no deben hacer una diferencia en una base de datos que cumple con el estándar SQL. El orden de evaluación no está garantizado en la mayoría de las bases de datos.

No creo que SQL se preocupe por el orden.A continuación se 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 ejecuta en primer lugar, los nombres de tablas numéricas entonces sólo serían arrojados 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.

+0

¿Qué tiene que ver la consulta que causa un error con el orden de la evaluación del predicado WHERE? – Jim

+3

@Jim Si 'ISNUMERIC (table_name) = 1' se evaluó primero, entonces' CAST' solo se llamaría para los nombres de las tablas numéricas. Pero dado que no se evalúa primero, 'CAST' también se evalúa para nombres de tabla no numéricos que causan el mensaje de error. – hibbelig

+0

Excelente aclaración – neeohw

0

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.

6

ANSI SQL Draft 2003 5WD-01-Marco-2003-09.pdf

6.3.3.3 orden de evaluación Regla

...

Cuando la prioridad no está determinada por los formatos o entre paréntesis, la evaluación efectiva de 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

1

comunicado OP original

Mi creencia es que el segundo es más rápido porque el criterio más único (Apellido) es lo primero en> la cláusula where, y los registros conseguirá eliminado más eficientemente. 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 primero las columnas más selectivas que las segundas más selectivas, y así sucesivamente.

BTW, para las dos consultas anteriores, el optimizador de servidor SQL no realizará ninguna optimización, pero utilizará el plan Trivila siempre que el costo total del plan sea inferior al costo de umbral de paralelismo.

Cuestiones relacionadas