columna xid en dba_hist_active_sess_history

La vista DBA_HIST_ACTIVE_SESS_HISTORY y su origen GV$ACTIVE_SESSION_HISTORY mantienen un muestreo de lo que hacen las sesiones que tienen actividad en el sistema. La primera mantiene un historial de lo capturado por la vista VG$ y de acuerdo a la retención especificada en el repositorio AWR y la segunda sólo mantiene algunas horas.

Estas vistas se pueden usar de muchas maneras distintas para entender y mejorar el desempeño de una BD. La plataforma Cloud Control la utiliza en la gran mayoría de las páginas del pack de diagnóstico. El uso de estas vistas requiere poseer la licencia del pack de diagnóstico.

En este artículo nos concentramos en el uso de la columna XID de estas vistas. XID es el identificador de transacción, es decir, cada transacción tiene un valor distinto de XID. Esta columna nos permite entonces agrupar una serie de filas de la vista agrupadas por XID, es decir agrupadas por transacción.

Pero cómo se relaciona este valor con el resto de vistas del diccionario que almacenan identificadores de transacciones como GV$TRANSACTION, QUEUE_TABLES (enq_tid, deq_tid)

En el manual de referencia dice que el tipo es RAW(8) y su descripción es: "Transaction ID that the session was working on at the time of sampling. V$SESSION does not contain this information."

El identificador lógico de una transacción en la vista GV$TRANSACTION es la composición de XIDUSN (Undo segment number), XIDSLOT (Slot number) y XIDSQN (Sequence number).

La transformación de XIDUSN, XIDSLOT y XIDSQN a XID es la concatenación de en hexadecimal de los 3 números con los siguientes formatos XIDUSN: 0XXX, XIDSLOT 0XXX y XIDSQN 0XXXXXXX, pero en cada número de deben ivertir el orden de los bytes de forma que quede el más significativo al comienzo.

Es decir:
substr(ltrim(to_char(xidusn,'0XXX')),3,2)||substr(ltrim(to_char(xidusn,'0XXX')),1,2)
||substr(ltrim(to_char(xidslot,'0XXX')),3,2)||substr(ltrim(to_char(xidslot,'0XXX')),1,2)
||substr(ltrim(to_char(xidsqn,'0XXXXXXX')),7,2)||substr(ltrim(to_char(xidsqn,'0XXXXXXX')),5,2)
||substr(ltrim(to_char(xidsqn,'0XXXXXXX')),3,2)||substr(ltrim(to_char(xidsqn,'0XXXXXXX')),1,2)


En las tablas de colas, existen las columnas ENQ_TID y DEQ_TID descritos como "ID number of the transaction that enqueued/dequeued this message" con tipo de datos VARCHAR2(30) cuyo formato es "xidusn.xidslot.xidsqn" por lo que para transformar estas columnas a XIDUSN, XIDSLOT y XIDSQN se puede usar:

select regexp_replace(deq_tid,'^([^\.]+)\.([^\.]+)\.(.+)$','\1') xidusn
, regexp_replace(deq_tid,'^([^\.]+)\.([^\.]+)\.(.+)$','\2') xidslot
, regexp_replace(deq_tid,'^([^\.]+)\.([^\.]+)\.(.+)$','\3') xidsqn from queue_table

Comentarios

Entradas más populares de este blog

Algoritmo de Merge con Delete

Análisis de SQL usando trace con eventos y variables de bind