Una vez tuve la necesidad de saber si una tabla x$ tiene estadísticas calculadas, estuve buscando en la documentación, página de soporte y en general en internet y no encontré más que ejemplos donde se asumía que las estadísticas no habían sido calculadas y por lo tanto se ejecutaban nuevamente.
Información parcial sobre las estadísticas se almacena en la tabla ASSOCIATION$
Name Null? Type
----------------------------------------- -------- ----------------------------
OBJ# NOT NULL NUMBER
PROPERTY NOT NULL NUMBER
INTCOL# NUMBER
STATSTYPE# NUMBER
DEFAULT_SELECTIVITY NUMBER
DEFAULT_CPU_COST NUMBER
DEFAULT_IO_COST NUMBER
DEFAULT_NET_COST NUMBER
INTERFACE_VERSION# NUMBER
SPARE2 NUMBER
y la columna que identifica los objetos sobre los que almacena estadísticas es obj#. El siguiente paso es buscar el obj# en la tabla obj$, pero aún en el caso donde hay tablas x$ con estadísticas no hay ninguna ocurrencia de ellas en la tabla obj$.
La razón es que en general las tablas x$ son estructuras de datos que se cargan en memoria desde que se inicia la instancia, y que sufren cambios mientras la instancia se encuentra arriba. Las tablas x$ no se almacenan en el disco tal y como están en memoria, de modo que tampoco habrá una fila en la tabla obj$ para estas tablas. Sin embargo las estadísticas sí se almacenan en disco, de ahí la pregunta ¿dónde se almacenan dichas estadísticas?
select * from obj$ where name = ‘S$KQFVI’
Dado que las tablas x$ no se almacenan en disco pero sí sus estadísticas, en mi opinión, Oracle se topó con el problema de almacenar en una estructura donde se almacenan objetos que son estructuras de datos en disco, una estructura almacenada únicamente en memoria. Así que sustituye el prefijo X de la tabla x$ por el prefijo S -nuevamente en mi opinión de la palabra [S]tatistic-. De modo que haciendo la sustitución podemos encontrar el obj# dentro de la tabla obj$ y finalmente buscar las estadísticas en la tabla ASSOCIATION$.