Reducir High Watermark (HWM) de Advanced Queueing | ExpoDBA

Reducir High Watermark (HWM) de Advanced Queueing

Reducir High Watermark (HWM) de Advanced Queueing

Las Advanced Queues (AQ) son objetos de la base que constan de un buffer de memoria y un segmento asociado.

Cuando los mensajes entran en la queue, son almacenados en memoria y en su segmento asociado pasado un tiempo (segun como se configure la AQ).

Como los mensajes están de paso en el segmento, después de desencolados son borrados y se libera el espacio.

¿Pero que pasa cuando se juntan muchos mensajes sin desencolar? En este caso el segmento empieza a crecer reservando más extents para almacenar los datos.

Luego de desencolados, el segmento se libera, pero no se modifica la HWM dejando reservados todos los extents y ocupando más espacio del necesario, haciendo además que cada consulta a la queue, requiera recorrer el segmento entero en busca de datos, generando un problema importante de performance.

 

Por suerte a partir de 10.2 podemos hacer un shrink sobre la tabla asociada al semento de manera online, haciendo que se actualice la HWM al valor que le corresponde.

alter table <nombre_segmento_tabla_aq> enable row movement;
alter table <nombre_segmento_tabla_aq> shrink space cascade;
alter table <nombre_segmento_tabla_aq> disable row movement;

alter table aq$_<nombre_segmento_tabla_aq>_I shrink space;
alter table aq$_<nombre_segmento_tabla_aq>_T shrink space;
alter table aq$_<nombre_segmento_tabla_aq>_H shrink space;

alter table aq$_<nombre_segmento_tabla_aq>_S enable row movement;
alter table aq$_<nombre_segmento_tabla_aq>_S shrink space cascade;
alter table aq$_<nombre_segmento_tabla_aq>_S disable row movement; 

Este proceso, si bien es online, deja algunos objetos inherentes a la AQ inválidos, que deben ser recompilados, por lo que si estamos en el server de la base podemos ejecutar:

@$ORACLE_HOME/rdbms/admin/utlrp.sql;

Para compilar todos los objetos inválidos.