« Sobre medios en Oracle9i y Oracle10g (Instaladores)Preparando el Examen RAC 11gr2 »

Cosas sobre sys.col_usage$



La tabla sys.col_usage$ almacena de forma automática a través del proceso SMON , la cantidad de veces que alguna columna se ocupa en una claúsula WHERE de una sentencia SQL, si esto lo miramos con un poco de altura de miras, no solamente veremos que es información estadística que se almacena para siempre y por siempre, he acá algunas cosas para tener en cuenta



Desde está información por ejemplo nosotros podríamos chequear cual es el mejor índice o cuales son los índices necesarios en una tabla de acuerdo a los filtros que tenga..

La estructura de la tabla

SQL> desc sys.col_usage$
Name Null? Type
----------------------------------------- -------- -----------------------
OBJ# NUMBER
INTCOL# NUMBER
EQUALITY_PREDS NUMBER
EQUIJOIN_PREDS NUMBER
NONEQUIJOIN_PREDS NUMBER
RANGE_PREDS NUMBER
LIKE_PREDS NUMBER
NULL_PREDS NUMBER
TIMESTAMP DATE



La explicación de sus columnas

OBJ# : Es el id del objeto (tabla principal) , este id lo podemos ubicar en DBA_OBJECTS.OBJECT_ID

INTCOL# : Es el id de la columna, se puede obtener su nombre desde DBA_TAB_COLUMNS.COLUMN_ID

EQUALITY_PREDS : Es la cantidad de filtros en el where del tipo
ej : where campo1 = -literal-

EQUIJOIN_PREDS : Es la cantidad de filtros en el where del tipo
ej : where tabla1.campo1 = tabla2.campo1

NONEQUIJOIN_PREDS : Es la cantidad de filtros en el where del tipo
ej : where tabla1.campo1 =! tabla2.campo1

RANGE_PREDS : Es cuando el campo es utilizado dentro de una claúsula BETWEEN

LIKE_PREDS : Es cuando el campo es utilizado dentro de una claúsula LIKE

NULL_PREDS : Es cuando se consulta por si el campo es nulo o no nulo
ej : where tabla1.campo1 is null

TIMESTAMP : Es la fecha en que se produjo la última utilización de fitros (where) para un objeto en partícular.



Una forma más amistosa de chequear los datos de la tabla SYS.COL_USAGE$ es mediante la siguiente consulta, que entrega los nombres de los objetos y claro, el nombre de la columna de forma inmediata

select oo.name owner,
o.name,
c.name column_name,
u.equality_preds,
u.equijoin_preds,
u.nonequijoin_preds,
u.range_preds,
u.like_preds,
u.null_preds,
u.timestamp
from sys.col_usage$ u ,
sys.obj$ o ,
sys.user$ oo,
sys.col$ c
where o.obj# = u.obj#
and oo.user# = o.owner#
and c.obj# = u.obj#
and c.col# = u.intcol#
AND o.name = 'nombre del objeto a consultar'



Esta tabla también tiene la gracia que a partir de ahí Oracle puede generar los histogramas cuando se ocupa el package DBMS_STATS con el parámetro METHOD_OPT => 'FOR all COLUMNS SIZE auto', o sea, le indicamos a él que calcule la cantidad de buckets para nuestro histograma (de 1 a 256)

Si hacemos lo siguiente

- Generamos una tabla
- Cargamos datos en la tabla
- Generamos histogramas

No estaría correcto, ya que los histogramas no se van a generar con información fidedigna , a menos que haya información en la SYS.COL_USAGE$ y solamente habrá información en esa tabla si comenzamos a utilizar filtros en la consultas que ocupan esa tabla

A partir de Oracle10g la información se carga a esta tabla cuando se produce una toma de estadísticas o se puede hacer ejecutando la siguiente instrucción

exec dbms_stats.flush_database_monitoring_info;



La carga de está información se realiza con una frecuencia de minutos , quizás podríamos decir unos 15 , o cuando se hace alguna actualización o inserción , como podemos apreciar de distintas fuentes está tabla SYS.COL_USAGE$ se actualiza

by Ligarius
04.03.13. 07:32:11. 610 words, 3676 views. Categories: Base de datos, Tuning / Performance ,