2010-01-28 8 views
6

Decir que tengo una consulta como la siguiente:¿El orden de JOINs hace la diferencia?

SELECT t1.id, t1.Name 
FROM Table1 as t1 --800,000 records 
INNER JOIN Table2 as t2 --500,000 records 
ON t1.fkID = t2.id 
INNER JOIN Table3 as t3 -- 1,000 records 
ON t1.OtherId = t3.id 

iba yo a ver una mejora del rendimiento si cambiaba el orden de mi une en Tabla2 y Tabla 3. Consulte a continuación:

SELECT t1.id, t1.Name 
FROM Table1 as t1 --800,000 records 
INNER JOIN Table3 as t3 -- 1,000 records 
ON t1.OtherId = t3.id 
INNER JOIN Table2 as t2 --500,000 records 
ON t1.fkID = t2.id 

He oído que el Optimizador de consultas intentará determinar el mejor orden pero no siempre funciona. ¿La versión de SQL Server que está usando hace la diferencia?

Respuesta

6

El orden de las uniones no hace diferencia.

Lo que hace la diferencia es asegurarse de que sus estadísticas estén actualizadas.

Una forma de verificar sus estadísticas es ejecutar una consulta en SSMS e incluir el plan de ejecución real. Si el número estimado de filas es muy diferente al número real de filas utilizadas por cualquier parte del plan de ejecución, entonces sus estadísticas están desactualizadas.

Las estadísticas se reconstruyen cuando se reconstruyen los índices relacionados. Si su ventana de mantenimiento de producción lo permite, actualizaría las estadísticas todas las noches.

Esto actualizará las estadísticas de todas las tablas de una base de datos:

exec sp_MSforeachtable "UPDATE STATISTICS ?" 
+0

¿Cómo lo compruebo? ¿Existe una buena regla general sobre la frecuencia con la que debo actualizar mis estadísticas? –

+0

¿Las filas estimadas y reales no están incluidas en el plan de ejecución real? Entonces, si está estimando 1 fila y está devolviendo miles, entonces probablemente deba actualizar mis estadísticas. ¿Hace una diferencia si me estoy uniendo en una mesa temporal? –

+0

Además, ¿las estadísticas marcan la diferencia si se une a una vista? –

1

El optimizador de consultas debe manejar con facilidad estos como exactamente la misma consulta, y encontrar la mejor manera de hacerlo.

Mucho de esto es más acerca de las estadísticas que el número de registros. Por ejemplo, si la gran mayoría de los valores en t1.fkID son idénticos, esta información puede influir mucho en la calidad de servicio.

3

El orden de las uniones hace una diferencia solo si especifica OPTION (FORCE ORDER). De lo contrario, el optimizador reorganizará su consulta de la forma que considere más eficiente.

En realidad, hay ciertos casos en los que creo que necesito usar FORCE ORDER, pero, por supuesto, son pocos y distantes. Si no está seguro, solo SET STATISTICS [TIME|IO] ON y compruébelo usted mismo. Probablemente descubrirá que su versión se ejecuta más lentamente que la versión optimizada en la mayoría de los casos, si no en todos.

Cuestiones relacionadas