Sentencias lentas en SQL Server 2008.

1286812811Lpfa51N


Una aplicación GeneXus, tenia una sentencia SQL parecida a esta:
SELECT T1.[SKMovId], T1.[SKMovFch], T2.[DepositoId], T2.[DepositoTipo], T1.[ProductoId], T1.[SKMovCantidad]
FROM ([SKMovimientos] T1 WITH (NOLOCK) INNER JOIN [Depositos] T2 WITH (NOLOCK) ON T2.[DepositoId] = T1.[DepositoId]) 
WHERE (T1.[SKMovFch] >=  @AV6cFechaInicial)  
AND (T1.[ProductoId] = @AV9cProductoId) 
AND (T2.[DepositoTipo] = @AV7cDepositoTipo)  

Hace un join entre dos tablas SKMovimientos que tiene cientos de miles de registros y Depositos que tiene menos de 10 registros. Demoraba 24 segundos y devolvía 17 registros. Extremadamente lenta.

Viendo el plan de ejecución de la sentencia pudimos ver que utilizaba un índice incorrecto en la tabla SKMovimientos.

Hacer un select en la tabla SKMovimientos sola, sacando la condicion que restringe por DepositoTipo y era instantánea y utilizaba el índice adecuado.

Revisando las estadísticas y tenia la creación de estadísticas y su actualización en forma automática.

Revisamos los índices de las tablas y eran los correctos.

Revisamos también la fragmentación de la tabla SKMovimientos y era un poco mas del 20% (alta pero nada llamativo). La desfragmentamos pero no mejoró nada.

Desfragmentamos la tabla Depositos (que tiene 9 registros) y la consulta paso a ser instantánea.

CONCLUSION

Desfragmentar todas las tablas del sistema, por pequeñas que sean, pueden mejorar la mucho la performance en SQL Server 2008.


Link relacionados
Como defragmentar indices y tablas en SQL Server




Duda: Se dice defragmentar o desfragmentar? Lo he visto de ambas formas.

Comentarios

  1. Y esa tabla pequeña siempre tenía esa cantidad de registros o en alguna época había tenido miles de registros?

    No me extrañaría encontrar bugs en SQL Server 2008, lo hicieron casi de nuevo, y ya le encontramos algunos Bugs groseritos (parser + estadísticas).

    Con el tema de estadísticas, siempre es recomendable hacerle un plan de mantenimiento al SQLServer en donde cada x tiempo se regeneren las estadísticas para que los planes de ejecución se adapten más a la realidad (en general SQLServer lo hace en linea, pero no es perfecto y falla en algunos casos.. como el que mencionaste).

    ResponderBorrar

Publicar un comentario

1) Lee el post
2) Poné tu opinión sobre el mismo.
Todos los comentarios serán leidos y la mayoría son publicados.

Entradas más populares de este blog

La nefasta influencia del golero de Cacho Bochinche en el fútbol uruguayo

Aplicación monolítica o distribuida?

Funcionalidades de GeneXus que vale la pena conocer: DATE Constants.