cómo borrar un histograma

Upload: miguel-angello

Post on 16-Mar-2016

218 views

Category:

Documents


0 download

DESCRIPTION

Mejor las busquedas de BBDD Oracle

TRANSCRIPT

Cmo borrar unhistogramaJanuary 31, 2009 karlmudespacher Cmo borrar un histograma sobre una columna? De manera muy genrica podemos decir que una base de datos relacional se basa mayormente en la teora de conjuntos y en modelos estadsticos. La teora de conjuntos en una base de datos generar los resultados correctos mientras que los modelos estadsticos servirn para que la respuesta solicitada se resuelva rpido.El tema con las estadsticas no es tener estadsticas, ni siquiera tener estadsticas actualizadas. Estamos hablando de modelos estadsticos por lo que lo importante es tener el modelo correcto, es decir, las estadsticas con los valores correctos. Para lograrlo puede optarse por cualquiera de las siguientes borrar estadsticas, generar estadsticas, haquear estadsticas, Cuando digo haquear estadsticas significa establecer valores en forma manual para que el modelo sea representado de forma ms acertada con las estadsticas.En una ocasin un administrador insista muchsimo en generar estadsticas e histogramas para todas las tablas y columnas de la base de datos. A pesar de haberle advertido que no lo hiciera, lo hizo. Cul fue el resultado? una catstrofe, los tiempos de respuesta se dispararon y la toma de estadsticas dur ms de dos das sin que terminara el proceso. Por ahora no explicar las razones pues ya ser tema de otro post hablar sobre los tipos de estadsticas, cundo y por qu obtenerlas. Por lo pronto quiero resolver la preguntacmo borrar un histograma sobre una columna?Dado que los histogramas son percentiles (Oracle Corporation los llama cubetas, aunque un percentil no tiene nada que ver con una cubeta), se necesita tener al menos dos percentiles para poder generar un histograma. As que si generamos un histograma con tamao 1 es realmente borrar el histograma previo. Si anteriormente no haba ningn histograma entonces Oracle generar datos en el diccionario donde diga que alguna vez se le gener un histograma a la columna de la tabla en cuestin.La sentencia es

exec dbms_stats.gather_table_stats(ownname => 'owner', tabname => 'table', method_opt => 'for columns column_name size 1');Vamos a aclararlo con un ejemploInicialmente tenemos una tabla llamada STAGE, y hacemos al diccionario la consulta

select column_Name, num_distinct, density, num_nulls, histogram from dba_tab_columns where table_Name = 'STAGE';

COLUMN_NAME NUM_DISTINCT DENSITY NUM_NULLS HISTOGRAM---------------- ------------- ---------- ------------ ----------ID 0 0 0 NONEOBJECT 0 0 0 NONETDATE 0 0 0 NONEID2 0 0 0 NONETenemos entonces una tabla con 4 columnas donde no se han generado estadsticas de ningn tipo. Y lo podemos confirmar con la sentencia

select column_Name, num_distinct, density, num_nulls, histogram from user_tab_columns where table_Name = 'STAGE';

COLUMN_NAME NUM_DISTINCT DENSITY NUM_NULLS HISTOGRAM---------------- ------------- ---------- ------------ ----------ID 11374 .00008792 0 NONEOBJECT 8732 .000114521 0 NONETDATE 497 .002012072 0 NONEID2 11374 .00008792 0 NONEAhora generamos un histograma con tamao 11, es decir con 10 percentilesexec dbms_stats.gather_table_stats(ownname => 'demo', tabname=> 'stage', method_opt => 'for columns object size 10');Nuevamente validamos los valores que la generacin del histograma ha modificado

COLUMN_NAME NUM_DISTINCT DENSITY NUM_NULLS HISTOGRAM---------------- ------------- ---------- ------------ ----------ID 11374 .00008792 0 NONEOBJECT 8732 .000223714 0 HEIGHT BALANCEDTDATE 497 .002012072 0 NONEID2 11374 .00008792 0 NONEFinalmente borramos el histograma sobre la columna object,

exec dbms_stats.gather_table_stats(ownname => 'demo', tabname=> 'stage', method_opt => 'for columns object size 1');

COLUMN_NAME NUM_DISTINCT DENSITY NUM_NULLS HISTOGRAM---------------- ------------- ---------- ------------ ----------ID 11374 .00008792 0 NONEOBJECT 8732 .000114521 0 NONETDATE 497 .002012072 0 NONEID2 11374 .00008792 0 NONEY finalmente tenemos los valores iniciales. Quiero enfatizar que antes de generar el histograma se tenan estadsticas para la tabla y que cuando se gener el histograma las estadsticas se modificaron. El tener estadsticas actualizadas no significa que son las estadsticas que mejor modelen la distribucin de los datos, al final, cuando eliminamos el histograma, las estadsticas volvieron a los valores iniciales.