Recopilación de información estadística en línea durante la carga de datos por lotes de Oracle

El nombre en inglés de esta función es Recopilación de estadísticas en línea para cargas masivas y este artículo es una prueba de esta función.

Esta función se describe como:

A partir de Oracle Database 12c, la base de datos puede recopilar estadísticas de tablas automáticamente durante los siguientes tipos de cargas masivas: INSERTAR EN... SELECCIONAR en una tabla vacía mediante una inserción de ruta directa y CREAR TABLA COMO SELECCIONAR.

Aquí hay dos puntos importantes:

  • la mesa debe estar vacía
  • Se requiere inserción de ruta directa (no importa si no registra o no)

De hecho, hay otra oración:

Por ejemplo, si sales es una tabla particionada vacía y ejecuta INSERT INTO sales SELECT, la base de datos recopila estadísticas globales de ventas. Sin embargo, la base de datos no recopila estadísticas a nivel de partición.

Es decir, para las tablas particionadas, solo se recopilan estadísticas globales y no se recopilan estadísticas a nivel de partición.

Comencemos el experimento.

Cree una nueva tabla, la tabla de hechos en el esquema SSB. En este punto, las estadísticas están vacías.

-- 新建表lineorder
alter session set nls_date_format = 'MM/DD/YYYY HH24:MI:SS';

select
num_rows,
sample_size,
last_analyzed,
tablespace_name
from dba_tables where table_name = 'LINEORDER';

  NUM_ROWS SAMPLE_SIZE LAST_ANALYZED       TABLESPACE_NAME
---------- ----------- ------------------- ------------------------------
                                           USERS

Inserción de ruta directa, con información estadística, no hay necesidad de recopilar información adicional.

alter session force parallel dml parallel 4;
set timing on
insert /*+ parallel(4) append */ into lineorder select /*+ parallel(4) */ * from lineorder_os;

384016850 rows created.

Elapsed: 00:03:35.29

select
num_rows,
sample_size,
last_analyzed,
tablespace_name
from dba_tables where table_name = 'LINEORDER';


  NUM_ROWS SAMPLE_SIZE LAST_ANALYZED       TABLESPACE_NAME
---------- ----------- ------------------- ------------------------------
 384016850   384016850 04/23/2023 09:52:14 USERS

Según el experimento de partición, elimine la tabla y vuelva a crearla. En este momento, las estadísticas globales no existen:

drop table lineorder purge;
create table lineorder ....;
alter table lineorder modify partition by range(lo_orderdate)
(
    partition p1992 values less than ('19930101'),
    partition p1993 values less than ('19940101'),
    partition p1994 values less than ('19950101'),
    partition p1995 values less than ('19960101'),
    partition p1996 values less than ('19970101'),
    partition p1997 values less than ('19980101'),
    partition p1998 values less than ('19990101')
);

alter session set nls_date_format = 'MM/DD/YYYY HH24:MI:SS';

select
num_rows,
sample_size,
last_analyzed,
tablespace_name
from dba_tables where table_name = 'LINEORDER';

  NUM_ROWS SAMPLE_SIZE LAST_ANALYZED       TABLESPACE_NAME
---------- ----------- ------------------- ------------------------------

Las estadísticas a nivel de partición no existen:

select
num_rows,
sample_size,
last_analyzed,
tablespace_name
from dba_tab_partitions where table_name = 'LINEORDER';

  NUM_ROWS SAMPLE_SIZE LAST_ANALYZED       TABLESPACE_NAME
---------- ----------- ------------------- ------------------------------
                                           USERS
                                           USERS
                                           USERS
                                           USERS
                                           USERS
                                           USERS
                                           USERS

7 rows selected.

La ruta directa inserta datos, las estadísticas globales están disponibles, pero las estadísticas a nivel de partición aún no existen:

alter session force parallel dml parallel 4;
set timing on
insert /*+ parallel(4) append */ into lineorder select /*+ parallel(4) */ * from lineorder_os;

384016850 rows created.

Elapsed: 00:03:53.65

select
num_rows,
sample_size,
last_analyzed,
tablespace_name
from dba_tables where table_name = 'LINEORDER';

  NUM_ROWS SAMPLE_SIZE LAST_ANALYZED       TABLESPACE_NAME
---------- ----------- ------------------- ------------------------------
 384016850   384016850 04/23/2023 10:06:22

select
num_rows,
sample_size,
last_analyzed,
tablespace_name
from dba_tab_partitions where table_name = 'LINEORDER';

  NUM_ROWS SAMPLE_SIZE LAST_ANALYZED       TABLESPACE_NAME
---------- ----------- ------------------- ------------------------------
         0             04/23/2023 10:03:54 USERS
         0             04/23/2023 10:03:54 USERS
         0             04/23/2023 10:03:54 USERS
         0             04/23/2023 10:03:54 USERS
         0             04/23/2023 10:03:54 USERS
         0             04/23/2023 10:03:54 USERS
         0             04/23/2023 10:03:54 USERS

7 rows selected.

Vuelva a recopilar la información estadística, y ahora la información estadística a nivel de partición también está disponible:

exec dbms_stats.gather_table_stats(null, 'LINEORDER', degree=>4);

PL/SQL procedure successfully completed.

select
num_rows,
sample_size,
last_analyzed,
tablespace_name
from dba_tables where table_name = 'LINEORDER';

  NUM_ROWS SAMPLE_SIZE LAST_ANALYZED       TABLESPACE_NAME
---------- ----------- ------------------- ------------------------------
 384016850   384016850 04/23/2023 10:10:51


select
num_rows,
sample_size,
last_analyzed,
tablespace_name
from dba_tab_partitions where table_name = 'LINEORDER';

  NUM_ROWS SAMPLE_SIZE LAST_ANALYZED       TABLESPACE_NAME
---------- ----------- ------------------- ------------------------------
  58399292    58399292 04/23/2023 10:09:21 USERS
  58237902    58237902 04/23/2023 10:09:34 USERS
  58268203    58268203 04/23/2023 10:09:48 USERS
  58258542    58258542 04/23/2023 10:10:02 USERS
  58427673    58427673 04/23/2023 10:10:15 USERS
  58267746    58267746 04/23/2023 10:10:29 USERS
  34157492    34157492 04/23/2023 10:10:43 USERS

7 rows selected.

referencia

Supongo que te gusta

Origin blog.csdn.net/stevensxiao/article/details/130366040
Recomendado
Clasificación