El servidor de base de datos actualiza las estadísticas de forma automática según el planificador y un conjunto de políticas de vencimiento. El sistema de actualización automática de estadísticas (AUS) identifica las tablas e índices que requieren nuevas estadísticas y ejecuta la sentencia UPDATE STATISTICS adecuada para optimizar el rendimiento de las consultas.
El sistema AUS se apoya en bases de datos transaccionales. El hecho de que las estadísticas estén permanentemente actualizadas y disponibles para el optimizador, garantiza que el rendimiento no se degradará debido a planes de acceso ineficientes.
A veces será necesario ajustar las políticas de vencimiento y/o el planificador para que se adapten a las necesidades del sistema. El sistema AUS se encuentra en la base de datos sysadmin, aunque también puede utilizarse OAT (Open Admin Tool).
Funcionamiento del AUS
AUS utiliza una serie de sensores, tareas, umbrales y tablas para evaluar y actualizar las estadísiticas.
Secuencia de eventos que definen como se actualizan las estadísiticas:
- El sensor del Scheduler mon_table_profile lee cada día la table systables de sysmaster.
- El sensor actualiza la tabla mon_table_profile de sysadmin con información de los cambios realizados sobre las tablas.
- La tarea Auto Update Statistics Evaluation guarda información diaria de la tabla mon_table_profile, systables, sysdistrib, syscolumns y sysindices de sysmaster.
- La tarea Auto Update Statistics Evaluation determina qué tablas necesitan actualización de estadísticas en función del vencimiento de las políticas.
- La tarea Auto Update Statistics Evaluation genera instrucciones UPDATE STATISTICS y las inserta en la tabla aus_command table de sysadmin.
- La tarea Auto Update Statistics Refresh ejecuta las instrucciones UPDATE STATISTICS de la table aus_command los sábados y domingos por la mañana entre la 1:00 AM y las 5:00 AM e inserta los resultados en la misma tabla. Las sentencias UPDATE STATISTICS que no se hayan completado antes de las 5:00 AM permaneces en la tabla.
Manejo de las políticas de vencimiento
Para cambiar el valor de una política de vencimiento , se debe actualizar la columna value de la tabla ph_threshold de sysadmin.
Ejemplo:
Si detectamos que las consultas lanzadas contra tablas pequeñas de menos de 1000 filas se ejecutan más rápido cuando se actualizan las estadísiticas más frecuentemente, se puede cambiar la política de vencimiento para asegurar que las estadísticas se actualizarán cada semana.
UPDATE ph_threshold SET value = 1000 WHERE name = «AUS_SMALL_TABLES“;
El nuevo umbral estará disponible la próxima vez que se ejecute la tarea Auto Update Statistics Evaluator.
Visualización las sentencias generadas por AUS
Para visualizar las sentencias UPDATE STATISTICS generadas por AUS antes de ser ejecutadas se puede consultar la vista aus_cmd_list y para visualizar las sentencias que se ejecutaron satisfactoriamente la vista aus_cmd_comp.
Ejemplos:
- Para visualizar todas las sentencias planificadas:
SELECT * FROM aus_cmd_list;
- Para visualizar las sentencias ejecutadas satisfactoriamente en los 30 días anteriores:
SELECT * FROM aus_cmd_comp;
- Para visualizar las sentencias que fallaron:
UPDATE ph_task SET tk_stop_time = «06:00:00» WHERE tk_name = «Auto Update Statistics Refresh»;Deshabilitar el sistema AUSUPDATE ph_task SET tk_enable = «F» WHERE tk_name = «Auto Update Statistics Evaluation»;
UPDATE ph_task SET tk_enable = «F» WHERE tk_name = «Auto Update Statistics Refresh»;
- Para deshabilitar AUS, se deben deshabilitar las tareas Auto Update Statistics Evaluation y Update Statistics Refresh:
UPDATE ph_task SET tk_monday = «T», tk_tuesday = «T», tk_wednesday = «T», tk_thursday = «T», tk_friday = «T» WHERE tk_name = «Auto Update Statistics Refresh»;
- Se puede cambiar cuando y durante cuanto tiempo se ejecuta la tarea Auto Update Statistics Refresh. Por ejemplo si detectamos que no todas las sentencias UPDATE STATISTICS se ejecutan en el período especificado, o queremos que las estadísticas se actualicen más frecuentemente, podemos cambiar el momento de inicio, de finalización y los días de la semana para ejecutar esta tarea.
SELECT aus_cmd_exe, aus_cmd_err_sql, aus_cmd_err_isam FROM aus_command WHERE aus_cmd_state = «E»;