2010-06-30 14 views
35

Suponga que category_id es una clave de índice (clave no primaria) de la tabla books. ¿Hay alguna diferencia entre las dos declaraciones SQL siguientes?SQL - ¿Importa el orden de DONDE las condiciones?

SELECT * FROM books WHERE author='Bill' AND category_id=1 

SELECT * FROM books WHERE category_id=1 AND author='Bill' 

supongo filtrar registros por primera vez por category_id y luego por author es más rápido que el filtrado en orden inverso. ¿Los motores SQL son lo suficientemente inteligentes como para hacerlo de esta manera?

+1

He buscado antes de publicar. ¿Alguien sabe cómo editar esta publicación para que sea más fácil que la busquen cuando otra persona tiene la misma pregunta más adelante? – powerboy

+0

@OMG _ Remus Rusanu publicó este enlace en una pregunta bastante recientemente. Tal vez fue eso? http://rusanu.com/2009/09/13/on-sql-server-boolean-operator-short-circuit/ –

+0

@Martin Smith: No sabía que Remus tenía un blog, muy bueno. ¿Tienes un enlace donde se publicó el enlace del blog? –

Respuesta

32

No, el orden de las cláusulas WHERE no importa.

El optimizador revisa la consulta & determina la mejor manera de obtener los datos basados ​​en índices y tal. Incluso si hubiera un índice de cobertura en las columnas category_id y autor, cualquiera cumpliría los criterios para usarlo (suponiendo que no haya algo mejor).

+0

Aunque estoy de acuerdo en una cosa que agregaría es que Pediría su lógica que pasará de inmediato al usar o declaraciones o podría fallar de inmediato al usar y declaraciones. No es necesario verificar otros criterios si puede averiguarlo de inmediato. – spinon

+0

¿Pueden las estadísticas que no están actualizadas afectar esto? –

+1

@Abe Miessler: Sí, las estadísticas y los índices desfasados ​​pueden afectar negativamente a lo que el optimizador elija. Pero cuantos más datos, más costoso puede ser mantenerlos actualizados. –

2

En resumen, no, no importan ya que el optimizador determinará la mejor forma de recuperar los datos.

8

SQL es declarative.

En su ejemplo, le ha dicho al motor/optimizador lo que desea ... ahora encontrará la mejor manera de hacerlo (dentro de lo razonable y de "costo", que estaría fuera del tema).

+5

+1 para la declaración verdadera. Dicho esto, Prolog es declarativo y, sin embargo (al menos con las implementaciones que he usado), importa el orden de las condiciones. –

2

Considerando que, en general, no, eso supone que está utilizando una base de datos moderna. Tal vez hace diez años, ciertamente importaba entonces.

+0

Sí. Parece que Oracle Rule Based Optimizer (RBO) vería el orden de los predicados en una cláusula where al desarrollar un plan de ejecución. –

+0

+1 por sugerir que los sistemas RDBMS anteriores posiblemente no tengan esta característica. – Nuzzolilo

Cuestiones relacionadas