El otro día me llamaron, porque desde hacía algunas semanas, venían observando que había aumentado de forma considerable el tiempo de
construcción de los
Cubos OLAP y así mismo el
crecimiento de una de las base de datos del sistema: la
tempdb.
Los tiempos de creación superaban las 8 o incluso 10 horas…
La primera acción que hice, fue revisar el estado de las estadísticas, y forzar una nueva actualización de las mismas. Ya que en multitud de problemas similares, las estadísticas juegan un pagel importante. De no estar actualizadas, es probable que existan o se generen planes de ejecución no óptimos. Os dejo un enlace donde trato la Actualización de estadísticas (síncronas o asíncronas) y como pueden mejorar la respuesta del optimizador de consultas. O si os interesa este tema os dejo otro enlace: Query Optimizer. Cardinality Estimation Error
Después de aplicar la actualización de estadísticas y mantenimiento de índices… Vi que los tiempo que se invertían en la construcción de los cubos no disminuían.
Me detuve un poco en estudiar el hardware de nuestro entorno. Probé en un entorno de pruebas y forzando el mismo escenario con la construcción del cubo. Y pudimos comprobar que los tiempos de creación, no mejoraban de forma considerable con más memoria RAM, y con hardware x64 (que permite trabajar con más memoria RAM).
Bueno, fue cuando llegó la hora de estudiar la consulta que se va de tiempo en la generación de los cubos, y poner un plan guiado. Para entender los Planes Guiados recomendamos la lectura: http://msdn.microsoft.com/es-es/library/ms179880.aspx.
Para lo cual, arrancamos el Profiler:
En la activación de la traza, seleccionamos Showplan XML:
Y recogemos trazas durante la ejecución de los cubos…
Una vez detectada la consulta que se va de tiempo (no comento en este articulo como hacerlo), la buscamos en la traza obtenida:

Se guarda la consulta en un .sql.
Se abre el .sql -> Seleccionar todo -> copiar -> y pegar en <exact query>, para luego ejecutar en la bbdd “ProjectServer_Reporting” :
EXEC sp_create_plan_guide N'guide_forceorder',
N'<exact query>',
N'SQL',
NULL,
NULL,
N'OPTION (force order)'
Despues de esta acción, pudimos comprobar como la ejecución de los cubos bajo a minutos, frente a las mas de 10 horas que tardaba inicialmente…
Fuentes:
Microsoft, MSDN.
Apunte y recopilación por Norman M. Pardell
Puedes consultarme, si deseas cualquier aclaración, pregunta o sugerencia en: Contacto, contestaré tan pronto como me sea posible.