Pregunta

Un compañero de trabajo me pidió que observara la indexación en algunas tablas porque su consulta se estaba ejecutando durante mucho tiempo. Más de una hora.

select count(1)
from databaseA.dbo.table1
inner join databaseA.dbo.table2 on (table1.key = table2.key)
inner join databaseB.dbo.table3 on (table1.key = table3.key)

Tenga en cuenta las diferentes bases de datos. Esto se estaba ejecutando desde DatabaseB

Las tablas 1 y 2 tenían más de 2 millones de registros. Table3 tenía una docena de registros más o menos.

Observé el plan de consulta y el optimizador decidió realizar búsquedas de índice de bucle anidado en las tablas 1 y 2 con Table3 como la tabla de manejo.

Mi primera suposición fue que las estadísticas estaban seriamente arruinadas en las Tablas 1 y amp; 2 pero antes de actualizar las estadísticas, intenté agregar una sugerencia de unión de esta manera:

select count(1)
from databaseA.dbo.table1
inner HASH join databaseA.dbo.table2 on (table1.key = table2.key)
inner join databaseB.dbo.table3 on (table1.key = table3.key)

Resultados devueltos en 15 segundos.

Como no tenía tiempo, le devolví los resultados, pero me preocupa que esto pueda causar problemas en el futuro.

¿Debo revisar el tema de las estadísticas y resolver el problema de esa manera? ¿Pudo haber resultado el plan de consultas incorrectas de que la unión sea de una base de datos separada?

¿Puede alguien ofrecerme algunas ideas basadas en su experiencia?

¿Fue útil?

Solución

Sospecharía las estadísticas primero.

Como sin duda sabe, el 99% de los casos debe evitar unirse a las sugerencias y usarlas solo cuando tenga pruebas de que son absolutamente necesarias.

Otros consejos

Verifique las estadísticas y la indexación en la tabla primero. Indices de índice pueden causar problemas. Si los datos en las tablas cambian, el optimizador no podrá elegir un plan más eficiente ya que usted lo ha obligado a usar siempre un hash.

¿Un bucle anidado no sería el más apropiado? Tome los 12 registros de la Tabla 3, y haga coincidir los 12 registros de la Tabla 1, y haga coincidir los 12 registros de la Tabla 2.

De lo contrario, su combinación hash también exigiría el ordenamiento, lo que significa que tendría 1 millón de registros de la Tabla 1 y la Tabla 2, y luego unirse a los 12 registros de la Tabla 3.

Vería las estadísticas de ambos planes, y sospecho que la combinación de bucles es en realidad más eficiente, pero se bloqueó o tu combinación hash aprovechó los datos almacenados en caché.

Pero, sí, en general, las sugerencias de unión son un último recurso.

Una consulta de ejecución lenta que involucra servidores vinculados podría tener que ver con la intercalación. Consulte aquí algunos antecedentes: http://blogs.msdn.com/psssql/archive/2008/02/14/how-it-works-linked-servers-and-collation-compatibility.aspx La sugerencia de combinación hash fuerza el orden, por lo que explica la ganancia de rendimiento.

Aquí se explica cómo configurar las opciones:

EXEC master.dbo.sp_serveroption 
    @server=N'databaseA', 
    @optname=N'collation compatible', 
    @optvalue=N'true'

EXEC master.dbo.sp_serveroption 
    @server=N'databaseA', 
    @optname=N'use remote collation', 
    @optvalue=N'false'

-Edoode

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top