Particionar tablas grandes en SQL Server

¡Buenas a todos! Hoy vamos a ver cómo reaccionar ante unos volúmenes de tablas inmensos. Aunque a veces un índice puede ser nuestra solución inmediata, hay otros casos en los que no resolvemos nada ya que la manera de acceder a los datos no es óptima. Es entonces, cuando nos planteamos particionar esa tabla.

Analizar el entorno

Partimos de un escenario algo contradictorio, como sabemos en el mundo del DBA todo va perfecto hasta que de repente la BBDD cambia (mágicamente)  y todo empieza a fallar como un circuito de fichas de dominó, por suerte, vamos a ver que debemos mirar.

Nos llaman por un job que tarda en finalizar en torno a 10 horas. Entramos en la máquina y vemos qué está corriendo. Gracias a sp_who2 hemos identificado su SPID y sacado el comando que está realizando.

Vemos que está lanzando la siguiente consulta a una tabla de 165 millones de registros.

SELECT count(*) FROM   eventotiempolinea with (nolock)      
    WHERE  idlocaliza NOT IN (SELECT id FROM   clientes) 
       OR ID IN (SELECT eventotiempolinea.id                
  FROM eventotiempolinea with (nolock), clientes          
  WHERE  eventotiempolinea.workresourceid = clientes.id   
  AND clientes.endtime IS NOT NULL                           
 AND eventotiempolinea.starttime > clientes.endtime) 

A veces nos encontramos entornos donde no podemos tocar la estructura de las querys por lo que solo nos queda realizar algunas tareas para mejorar el rendimiento. (Tenemos que tener en cuenta que estas tareas son paliativas, si el volumen de datos se vuelve a doblar o triplicar, tendremos que aplicar una solución nueva).

Plan de ejecución SQL Server

Aunque nuestro plan de  ejecución es bueno, sigue teniendo un alto coste que cambiaría radicalmente cambiando el código. La única solución posible que tenemos es particionar la tabla por el campo fecha para reducir la búsqueda a 1/60 (número de particiones que realizaremos sobre la tabla).

¿Qué parámetros seguimos para particionar?

Para orientarnos en las particiones podemos ir a las estadísticas de la tabla y ver sobre qué campo particionar.

Criterios para particionar en SQL Server

Aquí podremos ver un muestreo real de cómo quedarán los datos tras el particionado.

Si no quieres perderte más entradas como esta o necesitas que revisemos tu entorno. No dudes en suscribirte a nuestra newsletter y contacta con nosotros.