Le nom anglais de cette fonctionnalité est Online Statistics Gathering for Bulk Loads , et cet article est un test de cette fonctionnalité.
Cette fonctionnalité est décrite comme :
À partir d'Oracle Database 12c, la base de données peut collecter automatiquement des statistiques de table lors des types de chargements en bloc suivants : INSERT INTO … SELECT dans une table vide à l'aide d'un chemin direct insert et CREATE TABLE AS SELECT .
Il y a deux points importants ici :
- le tableau doit être vide
- L'insertion directe du chemin est requise (peu importe qu'il n'y ait pas de journalisation ou non)
En fait, il y a une autre phrase :
Par exemple, si sales est une table partitionnée vide et si vous exécutez INSERT INTO sales SELECT, la base de données collecte des statistiques globales pour les ventes. Cependant, la base de données ne collecte pas de statistiques au niveau de la partition.
Autrement dit, pour les tables partitionnées, seules les statistiques globales sont collectées et les statistiques au niveau de la partition ne sont pas collectées.
Commençons l'expérience.
Créez une nouvelle table, la table de faits dans le schéma SSB. À ce stade, les statistiques sont vides.
-- 新建表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
Insertion directe de chemin, avec des informations statistiques, il n'est pas nécessaire de collecter des informations supplémentaires.
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
Sur la base de l'expérience de partition, supprimez la table et reconstruisez-la. À ce stade, les statistiques globales n'existent pas :
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
---------- ----------- ------------------- ------------------------------
Les statistiques au niveau de la partition n'existent pas :
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.
Le chemin direct insère des données, des statistiques globales sont disponibles, mais les statistiques au niveau de la partition n'existent toujours pas :
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.
Re-collectez les informations statistiques, et maintenant les informations statistiques au niveau de la partition sont également disponibles :
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.
référence
- Vérifier l'heure de mise à jour des statistiques dans Oracle
- Comment savoir si les statistiques sont à jour dans Oracle Database ?
- Comment exécuter avec des politiques et définir des formats de date
- 10.3.3 Collecte de statistiques en ligne pour les chargements en masse
- Collecte de statistiques en ligne
- Collecte de statistiques en ligne pour le chargement de chemin direct