{"id":1412,"date":"2026-09-02T15:58:54","date_gmt":"2026-09-02T21:58:54","guid":{"rendered":"https:\/\/folken-it.com\/?p=1412"},"modified":"2026-09-02T15:59:01","modified_gmt":"2026-09-02T21:59:01","slug":"como-actualizar-exportar-e-importar-estadisticas-en-oracle-database-19c-y-21c","status":"publish","type":"post","link":"https:\/\/folken-it.com\/?p=1412","title":{"rendered":"C\u00f3mo actualizar, exportar e importar estad\u00edsticas en Oracle Database 19c y 21c"},"content":{"rendered":"\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"576\" src=\"https:\/\/i0.wp.com\/folken-it.com\/wp-content\/uploads\/2026\/09\/stats.png?resize=1024%2C576&#038;ssl=1\" alt=\"\" class=\"wp-image-1413\" srcset=\"https:\/\/i0.wp.com\/folken-it.com\/wp-content\/uploads\/2026\/09\/stats.png?resize=1024%2C576&amp;ssl=1 1024w, https:\/\/i0.wp.com\/folken-it.com\/wp-content\/uploads\/2026\/09\/stats.png?resize=300%2C169&amp;ssl=1 300w, https:\/\/i0.wp.com\/folken-it.com\/wp-content\/uploads\/2026\/09\/stats.png?resize=768%2C432&amp;ssl=1 768w, https:\/\/i0.wp.com\/folken-it.com\/wp-content\/uploads\/2026\/09\/stats.png?resize=229%2C129&amp;ssl=1 229w, https:\/\/i0.wp.com\/folken-it.com\/wp-content\/uploads\/2026\/09\/stats.png?resize=348%2C196&amp;ssl=1 348w, https:\/\/i0.wp.com\/folken-it.com\/wp-content\/uploads\/2026\/09\/stats.png?resize=999%2C562&amp;ssl=1 999w, https:\/\/i0.wp.com\/folken-it.com\/wp-content\/uploads\/2026\/09\/stats.png?resize=480%2C270&amp;ssl=1 480w, https:\/\/i0.wp.com\/folken-it.com\/wp-content\/uploads\/2026\/09\/stats.png?resize=1536%2C864&amp;ssl=1 1536w, https:\/\/i0.wp.com\/folken-it.com\/wp-content\/uploads\/2026\/09\/stats.png?w=1672&amp;ssl=1 1672w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Las estad\u00edsticas del optimizador son esenciales para el rendimiento de una base de datos Oracle. El Cost-Based Optimizer, conocido como CBO, utiliza esta informaci\u00f3n para estimar la cantidad de filas, el costo de las operaciones y el m\u00e9todo m\u00e1s eficiente para ejecutar una sentencia SQL.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Cuando las estad\u00edsticas est\u00e1n ausentes, desactualizadas o no representan correctamente los datos, Oracle puede seleccionar planes de ejecuci\u00f3n deficientes. Esto puede provocar full table scans innecesarios, joins costosos, consumo elevado de CPU, exceso de lecturas l\u00f3gicas y tiempos de respuesta impredecibles.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">En esta gu\u00eda aprenderemos a:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Identificar estad\u00edsticas faltantes o desactualizadas.<\/li>\n\n\n\n<li>Actualizar estad\u00edsticas de tablas, \u00edndices, esquemas y bases completas.<\/li>\n\n\n\n<li>Gestionar estad\u00edsticas de tablas particionadas.<\/li>\n\n\n\n<li>Utilizar estad\u00edsticas pendientes.<\/li>\n\n\n\n<li>Bloquear y desbloquear estad\u00edsticas.<\/li>\n\n\n\n<li>Restaurar una versi\u00f3n anterior.<\/li>\n\n\n\n<li>Exportar e importar estad\u00edsticas entre ambientes.<\/li>\n\n\n\n<li>Validar el resultado sin afectar la operaci\u00f3n.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Los ejemplos est\u00e1n orientados a Oracle Database 19c y 21c.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">Actualizar estad\u00edsticas no modifica los datos de negocio. Sin embargo, puede cambiar los planes de ejecuci\u00f3n utilizados por el optimizador y, por lo tanto, afectar el rendimiento de las aplicaciones.<\/p>\n<\/blockquote>\n\n\n\n<h2 class=\"wp-block-heading\">1. \u00bfQu\u00e9 son las estad\u00edsticas del optimizador?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Las estad\u00edsticas describen las caracter\u00edsticas de los objetos y de los datos almacenados.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Para una tabla pueden incluir:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>N\u00famero de filas.<\/li>\n\n\n\n<li>N\u00famero de bloques.<\/li>\n\n\n\n<li>Tama\u00f1o promedio de las filas.<\/li>\n\n\n\n<li>Fecha del \u00faltimo an\u00e1lisis.<\/li>\n\n\n\n<li>Porcentaje utilizado para obtener la muestra.<\/li>\n\n\n\n<li>Estad\u00edsticas de columnas.<\/li>\n\n\n\n<li>N\u00famero de valores distintos.<\/li>\n\n\n\n<li>Cantidad de valores nulos.<\/li>\n\n\n\n<li>Valores m\u00ednimo y m\u00e1ximo.<\/li>\n\n\n\n<li>Histogramas.<\/li>\n\n\n\n<li>Estad\u00edsticas de \u00edndices.<\/li>\n\n\n\n<li>Factor de clustering.<\/li>\n\n\n\n<li>Profundidad del \u00edndice.<\/li>\n\n\n\n<li>N\u00famero de bloques hoja.<\/li>\n\n\n\n<li>Estad\u00edsticas de particiones y subparticiones.<\/li>\n\n\n\n<li>Estad\u00edsticas extendidas sobre grupos de columnas o expresiones.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Oracle utiliza estas propiedades junto con los par\u00e1metros del optimizador y las estad\u00edsticas del sistema para estimar la cardinalidad de cada operaci\u00f3n.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">El paquete recomendado para administrarlas es <code>DBMS_STATS<\/code>. Oracle indica que este paquete permite recopilar, consultar y modificar estad\u00edsticas utilizadas por el optimizador. La base normalmente ejecuta una recopilaci\u00f3n autom\u00e1tica, por lo que los procedimientos manuales deben reservarse para situaciones controladas o especializadas. Consulta la <a href=\"https:\/\/docs.oracle.com\/en\/database\/oracle\/oracle-database\/19\/arpls\/DBMS_STATS.html\">documentaci\u00f3n oficial de DBMS_STATS<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">2. \u00bfCu\u00e1ndo deben actualizarse?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Oracle recopila estad\u00edsticas autom\u00e1ticamente durante las ventanas de mantenimiento, pero pueden ser necesarias ejecuciones adicionales cuando:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Se realiza una carga masiva.<\/li>\n\n\n\n<li>Se migra informaci\u00f3n.<\/li>\n\n\n\n<li>Se agrega o elimina una gran cantidad de filas.<\/li>\n\n\n\n<li>Se crea un \u00edndice.<\/li>\n\n\n\n<li>Se trunca o reconstruye una tabla.<\/li>\n\n\n\n<li>Se intercambia una partici\u00f3n.<\/li>\n\n\n\n<li>Cambia significativamente la distribuci\u00f3n de una columna.<\/li>\n\n\n\n<li>Se clona una base de datos.<\/li>\n\n\n\n<li>Se importa un esquema mediante Data Pump.<\/li>\n\n\n\n<li>Se ejecuta un deployment que modifica objetos.<\/li>\n\n\n\n<li>Aparecen planes de ejecuci\u00f3n inesperados.<\/li>\n\n\n\n<li>Una tabla nueva comienza a recibir tr\u00e1fico antes de la ventana autom\u00e1tica.<\/li>\n\n\n\n<li>Un proceso batch debe utilizar inmediatamente los nuevos datos.<\/li>\n\n\n\n<li>Las estad\u00edsticas autom\u00e1ticas no pueden terminar dentro de la ventana.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">No deben recopilarse estad\u00edsticas de toda la base como reacci\u00f3n autom\u00e1tica ante cualquier lentitud. Primero debe comprobarse que realmente est\u00e9n ausentes, obsoletas o sean responsables de un cambio de plan.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">3. Consultar cu\u00e1ndo fueron actualizadas<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Para revisar las estad\u00edsticas de una tabla:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SELECT owner,\n       table_name,\n       num_rows,\n       blocks,\n       avg_row_len,\n       sample_size,\n       last_analyzed,\n       stale_stats,\n       stattype_locked\nFROM dba_tab_statistics\nWHERE owner = 'APPUSER'\n  AND table_name = 'ORDERS';<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Para identificar objetos con estad\u00edsticas faltantes o posiblemente obsoletas:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SELECT owner,\n       table_name,\n       partition_name,\n       num_rows,\n       last_analyzed,\n       stale_stats,\n       stattype_locked\nFROM dba_tab_statistics\nWHERE owner = 'APPUSER'\n  AND (last_analyzed IS NULL OR stale_stats = 'YES')\nORDER BY table_name, partition_name;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><code>STALE_STATS = 'YES'<\/code> generalmente indica que el volumen de modificaciones super\u00f3 el porcentaje configurado mediante la preferencia <code>STALE_PERCENT<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Oracle mantiene informaci\u00f3n sobre inserciones, actualizaciones y eliminaciones. Para llevarla al diccionario antes de efectuar una validaci\u00f3n manual puede utilizarse:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>EXEC DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Despu\u00e9s:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SELECT table_owner,\n       table_name,\n       inserts,\n       updates,\n       deletes,\n       timestamp,\n       truncated\nFROM dba_tab_modifications\nWHERE table_owner = 'APPUSER'\nORDER BY timestamp DESC;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">No conviene ejecutar el <code>FLUSH_DATABASE_MONITORING_INFO<\/code> continuamente en scripts de monitoreo. Normalmente Oracle actualiza esta informaci\u00f3n de manera autom\u00e1tica.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">4. Consultar las preferencias de recopilaci\u00f3n<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Antes de lanzar <code>DBMS_STATS<\/code>, revisa las preferencias efectivas del objeto:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SELECT DBMS_STATS.GET_PREFS(\n           pname   =&gt; 'ESTIMATE_PERCENT',\n           ownname =&gt; 'APPUSER',\n           tabname =&gt; 'ORDERS'\n       ) AS estimate_percent\nFROM dual;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Puedes consultar otras preferencias:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SELECT DBMS_STATS.GET_PREFS(\n           pname   =&gt; 'METHOD_OPT',\n           ownname =&gt; 'APPUSER',\n           tabname =&gt; 'ORDERS'\n       ) AS method_opt\nFROM dual;<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>SELECT DBMS_STATS.GET_PREFS(\n           pname   =&gt; 'STALE_PERCENT',\n           ownname =&gt; 'APPUSER',\n           tabname =&gt; 'ORDERS'\n       ) AS stale_percent\nFROM dual;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Preferencias importantes:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>ESTIMATE_PERCENT<\/code><\/li>\n\n\n\n<li><code>METHOD_OPT<\/code><\/li>\n\n\n\n<li><code>DEGREE<\/code><\/li>\n\n\n\n<li><code>CASCADE<\/code><\/li>\n\n\n\n<li><code>NO_INVALIDATE<\/code><\/li>\n\n\n\n<li><code>GRANULARITY<\/code><\/li>\n\n\n\n<li><code>INCREMENTAL<\/code><\/li>\n\n\n\n<li><code>INCREMENTAL_STALENESS<\/code><\/li>\n\n\n\n<li><code>STALE_PERCENT<\/code><\/li>\n\n\n\n<li><code>PUBLISH<\/code><\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">5. Actualizar las estad\u00edsticas de una tabla<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Ejemplo recomendado:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>BEGIN\n    DBMS_STATS.GATHER_TABLE_STATS(\n        ownname          =&gt; 'APPUSER',\n        tabname          =&gt; 'ORDERS',\n        estimate_percent =&gt; DBMS_STATS.AUTO_SAMPLE_SIZE,\n        method_opt       =&gt; 'FOR ALL COLUMNS SIZE AUTO',\n        degree           =&gt; DBMS_STATS.AUTO_DEGREE,\n        cascade          =&gt; DBMS_STATS.AUTO_CASCADE,\n        no_invalidate    =&gt; DBMS_STATS.AUTO_INVALIDATE\n    );\nEND;\n\/<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Significado de los par\u00e1metros<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Par\u00e1metro<\/th><th>Funci\u00f3n<\/th><\/tr><\/thead><tbody><tr><td><code>ownname<\/code><\/td><td>Propietario de la tabla<\/td><\/tr><tr><td><code>tabname<\/code><\/td><td>Nombre de la tabla<\/td><\/tr><tr><td><code>estimate_percent<\/code><\/td><td>Porcentaje de datos analizados<\/td><\/tr><tr><td><code>method_opt<\/code><\/td><td>Controla estad\u00edsticas de columnas e histogramas<\/td><\/tr><tr><td><code>degree<\/code><\/td><td>Grado de paralelismo<\/td><\/tr><tr><td><code>cascade<\/code><\/td><td>Incluye estad\u00edsticas de \u00edndices<\/td><\/tr><tr><td><code>no_invalidate<\/code><\/td><td>Controla la invalidaci\u00f3n de cursores dependientes<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><code>DBMS_STATS.AUTO_SAMPLE_SIZE<\/code> permite a Oracle seleccionar una muestra adecuada. En versiones modernas normalmente es preferible a fijar manualmente un porcentaje.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>DBMS_STATS.AUTO_DEGREE<\/code> deja que Oracle determine el paralelismo. En producci\u00f3n debe evaluarse cuidadosamente porque una recopilaci\u00f3n paralela sobre tablas grandes puede competir con las aplicaciones.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>DBMS_STATS.AUTO_INVALIDATE<\/code> permite que Oracle controle la invalidaci\u00f3n progresiva de cursores, reduciendo el riesgo de hard parsing simult\u00e1neo.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">6. Actualizar estad\u00edsticas de una partici\u00f3n<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Para una sola partici\u00f3n:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>BEGIN\n    DBMS_STATS.GATHER_TABLE_STATS(\n        ownname          =&gt; 'APPUSER',\n        tabname          =&gt; 'SALES',\n        partname         =&gt; 'P202608',\n        estimate_percent =&gt; DBMS_STATS.AUTO_SAMPLE_SIZE,\n        method_opt       =&gt; 'FOR ALL COLUMNS SIZE AUTO',\n        granularity      =&gt; 'PARTITION',\n        cascade          =&gt; DBMS_STATS.AUTO_CASCADE,\n        degree           =&gt; DBMS_STATS.AUTO_DEGREE\n    );\nEND;\n\/<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Cuando se especifica <code>partname<\/code>, Oracle actualiza la partici\u00f3n indicada. Sin embargo, esto no garantiza por s\u00ed solo que las estad\u00edsticas globales de la tabla representen correctamente todas las particiones.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Para tablas particionadas de gran tama\u00f1o es recomendable evaluar las estad\u00edsticas incrementales.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">7. Estad\u00edsticas incrementales para tablas particionadas<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Cuando una tabla contiene cientos de particiones, recalcular todas las estad\u00edsticas globales puede consumir demasiado tiempo y recursos.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Las estad\u00edsticas incrementales permiten mantener sinopsis por partici\u00f3n y utilizarlas para construir estad\u00edsticas globales.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Configuraci\u00f3n:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>BEGIN\n    DBMS_STATS.SET_TABLE_PREFS(\n        ownname =&gt; 'APPUSER',\n        tabname =&gt; 'SALES',\n        pname   =&gt; 'INCREMENTAL',\n        pvalue  =&gt; 'TRUE'\n    );\nEND;\n\/<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Tambi\u00e9n puede configurarse:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>BEGIN\n    DBMS_STATS.SET_TABLE_PREFS(\n        ownname =&gt; 'APPUSER',\n        tabname =&gt; 'SALES',\n        pname   =&gt; 'INCREMENTAL_STALENESS',\n        pvalue  =&gt; 'USE_STALE_PERCENT'\n    );\nEND;\n\/<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Despu\u00e9s se recopilan las estad\u00edsticas:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>BEGIN\n    DBMS_STATS.GATHER_TABLE_STATS(\n        ownname          =&gt; 'APPUSER',\n        tabname          =&gt; 'SALES',\n        estimate_percent =&gt; DBMS_STATS.AUTO_SAMPLE_SIZE,\n        method_opt       =&gt; 'FOR ALL COLUMNS SIZE AUTO',\n        granularity      =&gt; 'AUTO',\n        cascade          =&gt; DBMS_STATS.AUTO_CASCADE\n    );\nEND;\n\/<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Para que el mantenimiento incremental funcione correctamente deben utilizarse valores compatibles, como <code>AUTO_SAMPLE_SIZE<\/code>, <code>GRANULARITY =&gt; 'AUTO'<\/code> y la preferencia <code>INCREMENTAL =&gt; 'TRUE'<\/code>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">8. Actualizar todas las estad\u00edsticas de un esquema<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Para recopilar estad\u00edsticas \u00fanicamente de objetos que Oracle considera necesarios:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>BEGIN\n    DBMS_STATS.GATHER_SCHEMA_STATS(\n        ownname          =&gt; 'APPUSER',\n        options          =&gt; 'GATHER AUTO',\n        estimate_percent =&gt; DBMS_STATS.AUTO_SAMPLE_SIZE,\n        method_opt       =&gt; 'FOR ALL COLUMNS SIZE AUTO',\n        degree           =&gt; DBMS_STATS.AUTO_DEGREE,\n        cascade          =&gt; DBMS_STATS.AUTO_CASCADE,\n        no_invalidate    =&gt; DBMS_STATS.AUTO_INVALIDATE\n    );\nEND;\n\/<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">La opci\u00f3n <code>GATHER AUTO<\/code> permite seleccionar objetos sin estad\u00edsticas o con estad\u00edsticas obsoletas.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Otras opciones disponibles incluyen:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>GATHER<\/code>: recopila estad\u00edsticas de todos los objetos.<\/li>\n\n\n\n<li><code>GATHER AUTO<\/code>: selecciona los objetos que las necesitan.<\/li>\n\n\n\n<li><code>GATHER STALE<\/code>: objetos con estad\u00edsticas obsoletas.<\/li>\n\n\n\n<li><code>GATHER EMPTY<\/code>: objetos sin estad\u00edsticas.<\/li>\n\n\n\n<li><code>LIST AUTO<\/code>: genera una lista sin recopilar estad\u00edsticas.<\/li>\n\n\n\n<li><code>LIST STALE<\/code>: lista objetos con estad\u00edsticas obsoletas.<\/li>\n\n\n\n<li><code>LIST EMPTY<\/code>: lista objetos sin estad\u00edsticas.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Ejemplo para obtener una lista antes de ejecutar el cambio:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>DECLARE\n    l_objects DBMS_STATS.OBJECTTAB;\nBEGIN\n    DBMS_STATS.GATHER_SCHEMA_STATS(\n        ownname =&gt; 'APPUSER',\n        options =&gt; 'LIST STALE',\n        objlist =&gt; l_objects\n    );\n\n    FOR i IN 1 .. l_objects.COUNT LOOP\n        DBMS_OUTPUT.PUT_LINE(\n            l_objects(i).ownname || '.' ||\n            l_objects(i).objname || ' - ' ||\n            l_objects(i).objtype\n        );\n    END LOOP;\nEND;\n\/<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Esta validaci\u00f3n es \u00fatil en ambientes productivos porque permite estimar el alcance antes de comenzar.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">9. Actualizar estad\u00edsticas de toda la base<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Oracle permite recopilar estad\u00edsticas de toda la base:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>BEGIN\n    DBMS_STATS.GATHER_DATABASE_STATS(\n        options          =&gt; 'GATHER AUTO',\n        estimate_percent =&gt; DBMS_STATS.AUTO_SAMPLE_SIZE,\n        method_opt       =&gt; 'FOR ALL COLUMNS SIZE AUTO',\n        degree           =&gt; DBMS_STATS.AUTO_DEGREE,\n        cascade          =&gt; DBMS_STATS.AUTO_CASCADE,\n        no_invalidate    =&gt; DBMS_STATS.AUTO_INVALIDATE\n    );\nEND;\n\/<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Esta operaci\u00f3n puede abarcar una gran cantidad de objetos y consumir CPU, I\/O y espacio temporal. Antes de ejecutarla:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Estima el tiempo requerido.<\/li>\n\n\n\n<li>Verifica la ventana de mantenimiento.<\/li>\n\n\n\n<li>Revisa el paralelismo.<\/li>\n\n\n\n<li>Confirma la carga actual.<\/li>\n\n\n\n<li>Identifica tablas grandes y particionadas.<\/li>\n\n\n\n<li>Valida el espacio disponible en TEMP.<\/li>\n\n\n\n<li>Define un plan para restaurar estad\u00edsticas.<\/li>\n\n\n\n<li>Monitorea sesiones, waits y consumo de recursos.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">En la operaci\u00f3n diaria suele ser preferible actualizar \u00fanicamente las tablas o esquemas afectados.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">10. Estad\u00edsticas del diccionario y objetos fijos<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Despu\u00e9s de una instalaci\u00f3n, upgrade o cambio importante puede ser necesario recopilar estad\u00edsticas del diccionario:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>EXEC DBMS_STATS.GATHER_DICTIONARY_STATS;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Para los objetos fijos:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>EXEC DBMS_STATS.GATHER_FIXED_OBJECTS_STATS;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Las estad\u00edsticas de objetos fijos deben recopilarse cuando la base haya experimentado una carga representativa. Ejecutarlas inmediatamente despu\u00e9s del arranque puede producir informaci\u00f3n poco realista.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">No conviene incluir indiscriminadamente los esquemas internos de Oracle en scripts generales de recopilaci\u00f3n.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">11. Histograms: cu\u00e1ndo utilizarlos<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Los histogramas ayudan al optimizador cuando una columna tiene una distribuci\u00f3n desigual y los valores del predicado producen cardinalidades muy diferentes.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ejemplo autom\u00e1tico:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>method_opt =&gt; 'FOR ALL COLUMNS SIZE AUTO'<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Oracle decide qu\u00e9 columnas podr\u00edan beneficiarse seg\u00fan el uso registrado.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Forzar histogramas:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>BEGIN\n    DBMS_STATS.GATHER_TABLE_STATS(\n        ownname    =&gt; 'APPUSER',\n        tabname    =&gt; 'ORDERS',\n        method_opt =&gt; 'FOR COLUMNS SIZE 254 STATUS'\n    );\nEND;\n\/<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Forzar histogramas en todas las columnas no es recomendable. Puede:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Incrementar el tiempo de recopilaci\u00f3n.<\/li>\n\n\n\n<li>Aumentar el tama\u00f1o del diccionario.<\/li>\n\n\n\n<li>Crear planes dependientes de valores bind.<\/li>\n\n\n\n<li>Generar inestabilidad.<\/li>\n\n\n\n<li>No aportar beneficios en columnas uniformes.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Despu\u00e9s de cambiar histogramas, compara planes, cardinalidades y rendimiento real.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">12. Estad\u00edsticas extendidas<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Cuando varias columnas est\u00e1n correlacionadas, sus estad\u00edsticas individuales pueden producir estimaciones incorrectas.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Por ejemplo, <code>STATE<\/code> y <code>CITY<\/code> no son completamente independientes.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Crear un grupo de columnas:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SELECT DBMS_STATS.CREATE_EXTENDED_STATS(\n           ownname   =&gt; 'APPUSER',\n           tabname   =&gt; 'CUSTOMERS',\n           extension =&gt; '(STATE,CITY)'\n       ) AS extension_name\nFROM dual;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Despu\u00e9s:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>BEGIN\n    DBMS_STATS.GATHER_TABLE_STATS(\n        ownname          =&gt; 'APPUSER',\n        tabname          =&gt; 'CUSTOMERS',\n        estimate_percent =&gt; DBMS_STATS.AUTO_SAMPLE_SIZE,\n        method_opt       =&gt; 'FOR ALL COLUMNS SIZE AUTO'\n    );\nEND;\n\/<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Consulta las extensiones:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SELECT owner,\n       table_name,\n       extension_name,\n       extension\nFROM dba_stat_extensions\nWHERE owner = 'APPUSER';<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">13. Estad\u00edsticas pendientes<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Una actualizaci\u00f3n puede cambiar los planes inmediatamente. Para reducir el riesgo, Oracle permite generar estad\u00edsticas sin publicarlas.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Configura la tabla:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>BEGIN\n    DBMS_STATS.SET_TABLE_PREFS(\n        ownname =&gt; 'APPUSER',\n        tabname =&gt; 'ORDERS',\n        pname   =&gt; 'PUBLISH',\n        pvalue  =&gt; 'FALSE'\n    );\nEND;\n\/<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Recopila las estad\u00edsticas:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>BEGIN\n    DBMS_STATS.GATHER_TABLE_STATS(\n        ownname          =&gt; 'APPUSER',\n        tabname          =&gt; 'ORDERS',\n        estimate_percent =&gt; DBMS_STATS.AUTO_SAMPLE_SIZE,\n        method_opt       =&gt; 'FOR ALL COLUMNS SIZE AUTO',\n        cascade          =&gt; DBMS_STATS.AUTO_CASCADE\n    );\nEND;\n\/<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Las nuevas estad\u00edsticas quedan pendientes y todav\u00eda no son utilizadas por las sesiones normales.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Para probarlas en una sesi\u00f3n:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ALTER SESSION SET optimizer_use_pending_statistics = TRUE;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Despu\u00e9s pueden publicarse:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>BEGIN\n    DBMS_STATS.PUBLISH_PENDING_STATS(\n        ownname =&gt; 'APPUSER',\n        tabname =&gt; 'ORDERS'\n    );\nEND;\n\/<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">O eliminarse:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>BEGIN\n    DBMS_STATS.DELETE_PENDING_STATS(\n        ownname =&gt; 'APPUSER',\n        tabname =&gt; 'ORDERS'\n    );\nEND;\n\/<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Finalmente, devuelve la preferencia si no se requiere conservarla:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>BEGIN\n    DBMS_STATS.SET_TABLE_PREFS(\n        ownname =&gt; 'APPUSER',\n        tabname =&gt; 'ORDERS',\n        pname   =&gt; 'PUBLISH',\n        pvalue  =&gt; 'TRUE'\n    );\nEND;\n\/<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Este enfoque es especialmente \u00fatil para objetos cr\u00edticos cuyos planes deben probarse antes de una publicaci\u00f3n general.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">14. Bloquear y desbloquear estad\u00edsticas<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Para evitar que la recopilaci\u00f3n autom\u00e1tica o manual modifique estad\u00edsticas estables:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>EXEC DBMS_STATS.LOCK_TABLE_STATS('APPUSER', 'ORDERS');<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Consulta su estado:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SELECT owner,\n       table_name,\n       stattype_locked\nFROM dba_tab_statistics\nWHERE owner = 'APPUSER'\n  AND table_name = 'ORDERS';<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Para desbloquearlas:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>EXEC DBMS_STATS.UNLOCK_TABLE_STATS('APPUSER', 'ORDERS');<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Cuando las estad\u00edsticas de una tabla est\u00e1n bloqueadas, tambi\u00e9n se consideran bloqueadas las estad\u00edsticas dependientes de sus columnas e \u00edndices.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">No utilices el bloqueo como soluci\u00f3n permanente para un plan inestable sin entender su causa. Los datos pueden cambiar hasta que las estad\u00edsticas bloqueadas dejen de representar la realidad.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">15. Restaurar estad\u00edsticas anteriores<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Oracle mantiene un historial de estad\u00edsticas que puede utilizarse como rollback.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Comprueba desde cu\u00e1ndo hay informaci\u00f3n disponible:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SELECT DBMS_STATS.GET_STATS_HISTORY_AVAILABILITY\nFROM dual;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Consulta la retenci\u00f3n:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SELECT DBMS_STATS.GET_STATS_HISTORY_RETENTION\nFROM dual;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Lista las versiones hist\u00f3ricas de una tabla:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SELECT table_name,\n       stats_update_time\nFROM dba_tab_stats_history\nWHERE owner = 'APPUSER'\n  AND table_name = 'ORDERS'\nORDER BY stats_update_time DESC;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Restaura las estad\u00edsticas de una tabla:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>BEGIN\n    DBMS_STATS.RESTORE_TABLE_STATS(\n        ownname         =&gt; 'APPUSER',\n        tabname         =&gt; 'ORDERS',\n        as_of_timestamp =&gt; TO_TIMESTAMP(\n            '2026-08-31 22:00:00',\n            'YYYY-MM-DD HH24:MI:SS'\n        ),\n        force            =&gt; FALSE\n    );\nEND;\n\/<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Restaura un esquema:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>BEGIN\n    DBMS_STATS.RESTORE_SCHEMA_STATS(\n        ownname         =&gt; 'APPUSER',\n        as_of_timestamp =&gt; SYSTIMESTAMP - INTERVAL '2' HOUR\n    );\nEND;\n\/<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Despu\u00e9s de restaurar, valida:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>LAST_ANALYZED<\/code>.<\/li>\n\n\n\n<li>N\u00famero de filas y bloques.<\/li>\n\n\n\n<li>Histogramas.<\/li>\n\n\n\n<li>Plan hash value.<\/li>\n\n\n\n<li>Tiempo de ejecuci\u00f3n.<\/li>\n\n\n\n<li>Buffer gets.<\/li>\n\n\n\n<li>Cursores existentes.<\/li>\n\n\n\n<li>Rendimiento de otras sentencias que utilicen el objeto.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">16. \u00bfSe pueden exportar e importar las estad\u00edsticas?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">S\u00ed. Oracle permite exportar estad\u00edsticas a una tabla mediante <code>DBMS_STATS<\/code>. Despu\u00e9s, esa tabla puede trasladarse a otro ambiente usando Data Pump.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Este mecanismo puede utilizarse para:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Transferir estad\u00edsticas de producci\u00f3n a QA.<\/li>\n\n\n\n<li>Respaldarlas antes de una actualizaci\u00f3n.<\/li>\n\n\n\n<li>Conservar una l\u00ednea base antes de una carga masiva.<\/li>\n\n\n\n<li>Reproducir planes de ejecuci\u00f3n en un laboratorio.<\/li>\n\n\n\n<li>Migrar estad\u00edsticas junto con una aplicaci\u00f3n.<\/li>\n\n\n\n<li>Recuperar r\u00e1pidamente una configuraci\u00f3n conocida.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">17. Crear la tabla de estad\u00edsticas<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">En el esquema que almacenar\u00e1 las estad\u00edsticas:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>BEGIN\n    DBMS_STATS.CREATE_STAT_TABLE(\n        ownname =&gt; 'STATADMIN',\n        stattab =&gt; 'OPTIMIZER_STATS_BACKUP',\n        tblspace =&gt; 'USERS'\n    );\nEND;\n\/<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Esta tabla tiene una estructura especial. No debe crearse manualmente con <code>CREATE TABLE<\/code>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">18. Exportar estad\u00edsticas de una tabla<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>BEGIN\n    DBMS_STATS.EXPORT_TABLE_STATS(\n        ownname  =&gt; 'APPUSER',\n        tabname  =&gt; 'ORDERS',\n        partname =&gt; NULL,\n        stattab  =&gt; 'OPTIMIZER_STATS_BACKUP',\n        statid   =&gt; 'ORDERS_BEFORE_RELEASE',\n        cascade  =&gt; TRUE,\n        statown  =&gt; 'STATADMIN'\n    );\nEND;\n\/<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><code>STATID<\/code> funciona como una etiqueta que permite conservar varias versiones en la misma tabla.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">19. Importar estad\u00edsticas de una tabla<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>BEGIN\n    DBMS_STATS.IMPORT_TABLE_STATS(\n        ownname       =&gt; 'APPUSER',\n        tabname       =&gt; 'ORDERS',\n        partname      =&gt; NULL,\n        stattab       =&gt; 'OPTIMIZER_STATS_BACKUP',\n        statid        =&gt; 'ORDERS_BEFORE_RELEASE',\n        cascade       =&gt; TRUE,\n        statown       =&gt; 'STATADMIN',\n        no_invalidate =&gt; DBMS_STATS.AUTO_INVALIDATE,\n        force         =&gt; FALSE\n    );\nEND;\n\/<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Esta operaci\u00f3n publica las estad\u00edsticas importadas en el diccionario y puede influir en los planes de ejecuci\u00f3n.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">20. Exportar e importar un esquema<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Exportaci\u00f3n:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>BEGIN\n    DBMS_STATS.EXPORT_SCHEMA_STATS(\n        ownname =&gt; 'APPUSER',\n        stattab =&gt; 'OPTIMIZER_STATS_BACKUP',\n        statid  =&gt; 'APPUSER_BASELINE',\n        statown =&gt; 'STATADMIN'\n    );\nEND;\n\/<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Importaci\u00f3n:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>BEGIN\n    DBMS_STATS.IMPORT_SCHEMA_STATS(\n        ownname       =&gt; 'APPUSER',\n        stattab       =&gt; 'OPTIMIZER_STATS_BACKUP',\n        statid        =&gt; 'APPUSER_BASELINE',\n        statown       =&gt; 'STATADMIN',\n        no_invalidate =&gt; DBMS_STATS.AUTO_INVALIDATE,\n        force         =&gt; FALSE\n    );\nEND;\n\/<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">21. Exportar e importar todas las estad\u00edsticas de la base<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Exportaci\u00f3n:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>BEGIN\n    DBMS_STATS.EXPORT_DATABASE_STATS(\n        stattab =&gt; 'OPTIMIZER_STATS_BACKUP',\n        statid  =&gt; 'DATABASE_BASELINE',\n        statown =&gt; 'STATADMIN'\n    );\nEND;\n\/<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Importaci\u00f3n:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>BEGIN\n    DBMS_STATS.IMPORT_DATABASE_STATS(\n        stattab       =&gt; 'OPTIMIZER_STATS_BACKUP',\n        statid        =&gt; 'DATABASE_BASELINE',\n        statown       =&gt; 'STATADMIN',\n        no_invalidate =&gt; DBMS_STATS.AUTO_INVALIDATE,\n        force         =&gt; FALSE\n    );\nEND;\n\/<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Importar estad\u00edsticas de toda una base puede generar cambios de planes en numerosos objetos. Esta operaci\u00f3n requiere una ventana controlada, pruebas previas y un procedimiento de rollback.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">22. Transferir la tabla con Data Pump<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Una vez exportadas las estad\u00edsticas a <code>STATADMIN.OPTIMIZER_STATS_BACKUP<\/code>, traslada la tabla al ambiente destino.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Exportaci\u00f3n desde el sistema operativo:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>expdp system \\\n  directory=DATA_PUMP_DIR \\\n  dumpfile=optimizer_stats_backup.dmp \\\n  logfile=optimizer_stats_backup_exp.log \\\n  tables=STATADMIN.OPTIMIZER_STATS_BACKUP<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Importaci\u00f3n en el destino:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>impdp system \\\n  directory=DATA_PUMP_DIR \\\n  dumpfile=optimizer_stats_backup.dmp \\\n  logfile=optimizer_stats_backup_imp.log \\\n  tables=STATADMIN.OPTIMIZER_STATS_BACKUP<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Despu\u00e9s ejecuta <code>IMPORT_TABLE_STATS<\/code>, <code>IMPORT_SCHEMA_STATS<\/code> o <code>IMPORT_DATABASE_STATS<\/code>, seg\u00fan corresponda.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">En ambientes con nombres de esquema diferentes puede ser necesario evaluar <code>REMAP_SCHEMA<\/code>. Debe mantenerse clara la diferencia entre:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>El propietario del objeto cuyas estad\u00edsticas se importar\u00e1n.<\/li>\n\n\n\n<li>El propietario de la tabla que contiene el respaldo.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">23. Limitaciones al mover estad\u00edsticas entre ambientes<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Importar estad\u00edsticas no reproduce completamente el comportamiento de producci\u00f3n.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Tambi\u00e9n influyen:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Volumen real de datos.<\/li>\n\n\n\n<li>Par\u00e1metros del optimizador.<\/li>\n\n\n\n<li>Versi\u00f3n y Release Update.<\/li>\n\n\n\n<li>Configuraci\u00f3n de CPU.<\/li>\n\n\n\n<li>Memoria.<\/li>\n\n\n\n<li>Velocidad del almacenamiento.<\/li>\n\n\n\n<li>Paralelismo.<\/li>\n\n\n\n<li>Bind variables.<\/li>\n\n\n\n<li>NLS.<\/li>\n\n\n\n<li>Servicios.<\/li>\n\n\n\n<li>Adaptive Cursor Sharing.<\/li>\n\n\n\n<li>SQL Plan Baselines.<\/li>\n\n\n\n<li>Estad\u00edsticas del sistema.<\/li>\n\n\n\n<li>Distribuci\u00f3n real de datos.<\/li>\n\n\n\n<li>Objetos o \u00edndices que no existen en el destino.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Las estad\u00edsticas importadas ayudan a reproducir estimaciones y planes, pero no sustituyen una prueba de rendimiento representativa.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">24. Verificar la recopilaci\u00f3n autom\u00e1tica<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Comprueba el estado del cliente autom\u00e1tico:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SELECT client_name,\n       status,\n       window_group,\n       attributes\nFROM dba_autotask_client\nWHERE client_name = 'auto optimizer stats collection';<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Consulta las ventanas:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SELECT window_name,\n       enabled,\n       repeat_interval,\n       duration,\n       resource_plan\nFROM dba_scheduler_windows\nORDER BY window_name;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Revisa las operaciones recientes:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SELECT operation,\n       target,\n       start_time,\n       end_time,\n       status,\n       job_name,\n       notes\nFROM dba_optstat_operations\nORDER BY start_time DESC\nFETCH FIRST 30 ROWS ONLY;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Para obtener detalles:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SELECT DBMS_STATS.REPORT_STATS_OPERATIONS(\n           since  =&gt; SYSTIMESTAMP - INTERVAL '1' DAY,\n           until  =&gt; SYSTIMESTAMP,\n           detail_level =&gt; 'TYPICAL'\n       )\nFROM dual;<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">25. Monitorear una recopilaci\u00f3n en ejecuci\u00f3n<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Puedes localizar las sesiones relacionadas:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SELECT sid,\n       serial#,\n       username,\n       program,\n       module,\n       event,\n       state,\n       sql_id\nFROM v$session\nWHERE module LIKE '%DBMS_STATS%'\n   OR action LIKE '%DBMS_STATS%';<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Tambi\u00e9n revisa operaciones largas:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SELECT sid,\n       serial#,\n       opname,\n       target,\n       sofar,\n       totalwork,\n       units,\n       elapsed_seconds,\n       time_remaining\nFROM v$session_longops\nWHERE totalwork &gt; 0\n  AND sofar &lt; totalwork\nORDER BY start_time;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Durante una recopilaci\u00f3n grande monitorea:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>top\nvmstat 1\niostat -xz 1<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Y desde Oracle:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SELECT event,\n       total_waits,\n       time_waited_micro \/ 1000000 AS time_waited_seconds\nFROM v$system_event\nWHERE wait_class &lt;&gt; 'Idle'\nORDER BY time_waited_micro DESC\nFETCH FIRST 20 ROWS ONLY;<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">26. Procedimiento recomendado para producci\u00f3n<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Antes del cambio<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Identifica exactamente los objetos afectados.<\/li>\n\n\n\n<li>Revisa <code>LAST_ANALYZED<\/code> y <code>STALE_STATS<\/code>.<\/li>\n\n\n\n<li>Verifica estad\u00edsticas bloqueadas.<\/li>\n\n\n\n<li>Consulta las preferencias actuales.<\/li>\n\n\n\n<li>Registra los planes de ejecuci\u00f3n importantes.<\/li>\n\n\n\n<li>Exporta las estad\u00edsticas actuales.<\/li>\n\n\n\n<li>Confirma la disponibilidad del historial.<\/li>\n\n\n\n<li>Revisa la carga de la base.<\/li>\n\n\n\n<li>Define criterios de \u00e9xito y rollback.<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Durante el cambio<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Utiliza <code>AUTO_SAMPLE_SIZE<\/code>.<\/li>\n\n\n\n<li>Limita el alcance al objeto necesario.<\/li>\n\n\n\n<li>Controla el paralelismo.<\/li>\n\n\n\n<li>Monitorea CPU, I\/O, TEMP y waits.<\/li>\n\n\n\n<li>Registra inicio, fin y duraci\u00f3n.<\/li>\n\n\n\n<li>Evita recopilar simult\u00e1neamente con procesos cr\u00edticos.<\/li>\n\n\n\n<li>Considera estad\u00edsticas pendientes para objetos sensibles.<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Despu\u00e9s del cambio<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Valida <code>LAST_ANALYZED<\/code>.<\/li>\n\n\n\n<li>Revisa <code>NUM_ROWS<\/code>, <code>BLOCKS<\/code> y <code>SAMPLE_SIZE<\/code>.<\/li>\n\n\n\n<li>Confirma las estad\u00edsticas de \u00edndices.<\/li>\n\n\n\n<li>Verifica histogramas.<\/li>\n\n\n\n<li>Compara planes y cardinalidades.<\/li>\n\n\n\n<li>Ejecuta pruebas funcionales.<\/li>\n\n\n\n<li>Revisa DB Time y waits.<\/li>\n\n\n\n<li>Restaura las estad\u00edsticas anteriores si aparece una regresi\u00f3n.<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">27. Errores comunes<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Utilizar <code>ANALYZE TABLE<\/code> para estad\u00edsticas del optimizador<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Para estad\u00edsticas modernas del optimizador debe utilizarse <code>DBMS_STATS<\/code>. El comando <code>ANALYZE<\/code> conserva otros usos administrativos, pero no debe ser el mecanismo normal de mantenimiento del CBO.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Actualizar toda la base ante cualquier incidente<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Puede consumir recursos y cambiar numerosos planes sin resolver la causa original.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Utilizar un porcentaje fijo sin justificaci\u00f3n<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><code>AUTO_SAMPLE_SIZE<\/code> normalmente produce mejores resultados que un porcentaje elegido arbitrariamente.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Forzar histogramas en todas las columnas<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Puede aumentar el tiempo, el almacenamiento y la inestabilidad sin aportar valor.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Configurar <code>no_invalidate =&gt; FALSE<\/code> indiscriminadamente<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Puede invalidar muchos cursores al mismo tiempo y provocar una tormenta de hard parsing.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Utilizar paralelismo excesivo<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Una recopilaci\u00f3n puede competir con la carga productiva por CPU, I\/O y TEMP.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Importar estad\u00edsticas sin validar compatibilidad<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Los objetos, particiones, \u00edndices y versiones deben ser compatibles.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">No preparar un rollback<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Antes de modificar estad\u00edsticas cr\u00edticas deben exportarse o comprobarse en el historial.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusi\u00f3n<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Actualizar estad\u00edsticas en Oracle no es simplemente ejecutar <code>GATHER_SCHEMA_STATS<\/code>. Es una operaci\u00f3n que puede modificar las decisiones del optimizador y cambiar el rendimiento de toda una aplicaci\u00f3n.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La estrategia m\u00e1s segura consiste en:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Determinar qu\u00e9 objetos realmente necesitan estad\u00edsticas.<\/li>\n\n\n\n<li>Recopilar solamente el alcance necesario.<\/li>\n\n\n\n<li>Usar las opciones autom\u00e1ticas de Oracle como punto de partida.<\/li>\n\n\n\n<li>Probar estad\u00edsticas pendientes en objetos cr\u00edticos.<\/li>\n\n\n\n<li>Exportar o conservar una versi\u00f3n anterior.<\/li>\n\n\n\n<li>Comparar planes antes y despu\u00e9s.<\/li>\n\n\n\n<li>Monitorear el impacto real.<\/li>\n\n\n\n<li>Restaurar las estad\u00edsticas si aparece una regresi\u00f3n.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Oracle permite exportar e importar estad\u00edsticas de tablas, esquemas y bases completas mediante <code>DBMS_STATS<\/code>. Esta capacidad resulta especialmente \u00fatil para respaldar estad\u00edsticas antes de un cambio, migrarlas entre ambientes o reproducir planes de ejecuci\u00f3n.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La clave no es tener las estad\u00edsticas m\u00e1s recientes, sino disponer de estad\u00edsticas representativas que permitan al optimizador estimar correctamente el trabajo necesario.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Las estad\u00edsticas del optimizador son esenciales para el rendimiento de una base de datos Oracle. El Cost-Based Optimizer, conocido como CBO, utiliza [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"advanced_seo_description":"C\u00f3mo actualizar, exportar e importar estad\u00edsticas en Oracle Database 19c y 21c","jetpack_seo_html_title":"C\u00f3mo actualizar, exportar e importar estad\u00edsticas en Oracle Database 19c y 21c","jetpack_seo_noindex":false,"jetpack_seo_schema_type":"","_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[56,55],"tags":[],"class_list":["post-1412","post","type-post","status-publish","format-standard","hentry","category-databases","category-oracle"],"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/folken-it.com\/index.php?rest_route=\/wp\/v2\/posts\/1412","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/folken-it.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/folken-it.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/folken-it.com\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/folken-it.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1412"}],"version-history":[{"count":1,"href":"https:\/\/folken-it.com\/index.php?rest_route=\/wp\/v2\/posts\/1412\/revisions"}],"predecessor-version":[{"id":1414,"href":"https:\/\/folken-it.com\/index.php?rest_route=\/wp\/v2\/posts\/1412\/revisions\/1414"}],"wp:attachment":[{"href":"https:\/\/folken-it.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1412"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/folken-it.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1412"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/folken-it.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1412"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}