2009-08-26 11 views
5

Tengo una consulta que contiene tres instrucciones de combinación interna en la cláusula Where. La consulta tarda aproximadamente 2 minutos en ejecutarse. Si simplemente cambio el orden de dos de las combinaciones internas, el rendimiento se reduce a 40 segundos.SQL Server 2005 - Orden de combinaciones internas

¿Cómo hacer nada más que cambiar el orden de las uniones internas tiene un impacto tan drástico del rendimiento de la consulta? Pensé que el optimizador resolvería todo esto.

+1

No debería normalmente. ¿Lo pruebas dos maneras más de una vez? ¿Puedes publicar ambas versiones? – RBarryYoung

Respuesta

8

SQL es declarativo, es decir, UNIRSE a la orden no debería importar

Sin embargo, en la práctica, puede decirse que se trata de una consulta compleja cuando el optimizador no explora todas las opciones (lo que en teoría podría llevar meses).

Otra opción es que es una consulta muy diferente si reordena y obtiene resultados diferentes, pero esto es generalmente con OUTER JOINs.

Y también podría ser la forma en que se especifica la cláusula ON. Tiene que cambiar si reordena la cláusula FROM. A menos que esté usando la cláusula JOIN-in-the-WHERE más antigua (y mala).

Finalmente, si es una preocupación, podría usar paréntesis para cambiar el orden de evaluación y dejar claras sus intenciones, por ejemplo, filtrar en una tabla grande primero para generar una tabla derivada.

4

Porque al cambiar el orden de las uniones, SQL Server tiene un plan de ejecución diferente para su consulta (lo más probable es que cambie la forma en que filtra las tablas según sus uniones).

En este caso, supongo que tiene varias tablas grandes ... una de las cuales realiza la mayor parte del filtrado.

En una consulta, sus combinaciones unen varias de las tablas grandes y luego filtran los registros al final.

En la otra, está filtrando la primera tabla a un subconjunto de datos mucho más pequeño ... y luego uniendo el resto de las tablas. Desde esa tabla inicial se filtró antes de unirse a los otros grandes conjuntos de registros , el rendimiento es mucho mejor.

Siempre puede verificar pero ejecutar la consulta con la opción 'Mostrar plan de consulta' habilitada y ver cuál es el plan de consulta para las dos órdenes de unión diferentes.

-1

Hubiera pensado que era lo suficientemente inteligente como para hacer eso también, pero claramente sigue realizando las uniones en el orden en que las enumera explícitamente ... En cuanto a por qué eso afecta el rendimiento, si la primera unión produce un intermedio conjunto de resultados de solo 100 registros en un esquema de ordenamiento, luego la segunda unión será desde ese conjunto de 100 registros hasta la tercera tabla. Si poner primero la otra combinación produce un primer conjunto intermedio de resultados de un millón de registros, la segunda unión pasará de un conjunto de resultados de un millón a la tercera tabla ...

+1

El plan de consulta generalmente reordenar se une de manera óptima, pero tiene un tiempo de espera dentro del cual puede optimizar una consulta. Si la consulta es muy complicada, en realidad se dará por vencido y utilizará el mejor plan que se haya encontrado hasta el momento. Si hace clic en "Mostrar XML del plan de ejecución", verá esto como 'StatementOptmEarlyAbortReason =" TimeOut "' –

Cuestiones relacionadas