Sei sulla pagina 1di 4

Export / Import estadisticas de Oracle optimizer

Oracle nos da la facilidad de poder exportar e importar las


estadsticas de la base de datos , esto nos puede ser de mucha ayuda , por
ejemplo en el caso que tenemos la base de datos funcionando en ptimas
condiciones podemos tener una snapshot de las estadsticas y usarlas como
backup, ya que aveces el mantenimiento que realiza Oracle de forma
automatica la noche nos pude modificar algn plan de ejecucin y esto
desencadena en un dolor de cabeza al da siguiente.
Tambin podemos insertas las mismas estadsticas que tenemos en
produccin en un ambiente de testing , de esta manera obtendramos los
mismos planes , etc ,etc ..
Aqu les dejo el procesamiento para esto :
1- creo la tabla de estadsticas
execute dbms_stats.create_stat_table('CHARLY','STATS');
Donde CHARLY es el nombre del esquema y STATS es el nombre de la table
donde se almacenaran las estadsticas.

2- Realizamos un exp de las estadsticas del schema que nos interesa.


execute dbms_stats.export_schema_stats('CHARLY','STATS','PROD_201204-10');
Este comando carga informacin sobre las estadsticas del esquema en la
tabla STATS , y le colocamos como nombre PROD_2012-04-10 ya que
podemos hacer que este procedimiento sea regular y podremos identificar
cuando realizamos este export.
por tabla
EXECUTE DBMS_STATS.EXPORT_TABLE_STATS (
ownname => 'CHARLY',
tabname => 'nombre_de_la tabla_
a_exportar_estadisticas',
stattab => 'STATS',
statid => 'tabla_prod_2012-04-10');

3- Realizamos un export de la tabla STATS para transportar las estadsticas ,


se importa al schema destino
exp \' / as sysdba\' table=charly.stats file=stats.dmp
imp \' / as sysdba\' full=y file=stats.dmp

4- Importamos las estadsticas desde la tabla STATS al esquema destino


execute dbms_stats.import_schema_stats('CHARLY','STATS',' PROD_2012-0410');
Hacemos lo mismo si lo que queremos importar es solo las estadsticas de
una tabla:
execute dbms_stats.import_table_stats(ownname => 'CHARLY',
tabname => ' nombre_de_la tabla_
a_exportar_estadisticas ',
stattab => 'STATS',
statid => ' tabla_prod_2012-04-10 ');
Estadisticas en una base Oracle
El optimizador de Oracle se basa en los costos y estadsticas de la base
de datos, esto quiere decir que necesita informacin acerca de los datos
almacenados en la base para poder realizar un plan de ejecucin lo mas
ptimo posible, esta recoleccin de informacin comprende varios puntos
importantes, como puede ser la distribucin de los datos dentro de las
tablas, cantidad de ndices que hay sobre que columnas , lo selectivo que es
cada ndice, la distribucin de los datos dentro de una columna indexada
(clustering_factor) , como as tambin estadsticas del sistema, que pueden
variar si se toman de da o de noche , ya que una base de datos durante el
da puede trabajar como oltp y por la noche como olap, adems si basamos
nuestras estadsticas en el costo de cpu o de i/o.
A partir de la versin 10g hay un proceso de mantenimiento que captura
estadsticas de manera automtica en horarios nocturnos, esto es por
default y se puede modificar el horario o desabilitar.

El optimizador de oracle es una tema muy complejo y apasionante ya


que existe infinidad de polticas para su uso , y se podria variar su
comportamiento algunos parametros de inicializacion como pueden
ser optimizer_index_caching, optimizer_index_cost_adj, optimizer_max_perm
utations, etc.
Esta nota apunta a ensear los comandos basicos e indispensables para la
recuperacin de estadsticas .

Estadsticas de un esquema completo:


exec dbms_stats.gather_schema_stats (ownname=>'CHARLY',
estimate_percent=>
dbms_stats.auto_sample_size,
method_opt => 'FOR ALL COLUMNS

SIZE 10',
cascade => true
degree=>4);
Aqui voy a explicar algunas opciones de los parmetros mas importantes
de este package :
estimate_percent=>dbms_stats.auto_sample_size : Oracle decide que
grado de estadsticas toma .
estimate_percent=>100 : Oracle recorre todos los objetos del esquema y
toma el 100% de informacin , en bases de datos grandes muchas veces
es inviable esta opcin.
estimate_percent=>15 : Oracle estima y solo toma 15 % de la informacin
de cada objeto del esquema mencionado , el dba puede ir analizando si
con este porcentaje de muestra alcanza .
method_opt :
for all columns size skewonly : opcin que requiere mucho tiempo intensivo
porque examina la distribucin de valores para cada columna dentro de
cada ndice , DBMS_STATS descubre un ndice cuyas columnas estn
desigualmente distribuidos, se crear histogramas para dicho ndice para
tomar una decision al momento de usar un indice o hacer full scn de la
tabla.
for all columns size repeat: Oracle solo exinara los histogramas de las
columnas que ya tienen histogramas y no buscara potenciales nuevas
columnas analizar.
for all columns size auto (default): analizara histogramas de la columnas
que Oracle considere
casdade => true : indica que no solo va a tomar estadsticas de la tabla
sino de los indices asociados a esta.
degree=>4 : indica el grado de paralelismo , para poder tomar un grado
indicado de paralelismo podemos utilizar la siguiente regla :
degree = PARALLEL_THREADS_PER_CPU x CPU_COUNT
Tambin se puede recopilar estadsticas de una tabla o ndice:
exec dbms_stats.gather_index_stats('CHARLY', 'EMPLOYEES_PK',
estimate_percent => 15);
exec dbms_stats..gather_table_stats('CHALY','EMPLOYEES', estimate_percent
=> 15);

Insercion de estadisticar artificiales:


Nosotros como dba's podemos alterar los planes del optimizer , mediante

hint o bien siendo un poco mas radicales directamente generando


informacin falsa , de esta manera el optimizer podra utilizar un indice
que nosotros deseamos que use.
Por ejemplo:
dbms_stats.set_index_stats(ownname=> 'CHARLY',indname =>
'EMPLOYEES_IDX01',numdist=> 500);
Las estadsticas de sistema se toman de la siguiente manera:
exec dbms_stats.gather_system_stats (gathering_mode=>'START');
exec dbms_stats.gather_system_stats (gathering_mode=>'STOP');

Potrebbero piacerti anche