Oracleバッチ・データ・ロード中のオンライン統計情報の収集

この機能の英語名はOnline Statistics Gathering for Bulk Loadsで、この記事はこの機能のテストです。

この機能は次のように説明されています。

Oracle Database 12c以降、データベースは次のタイプのバルク・ロード中に表統計を自動的に収集できます: INSERT INTO …ダイレクト・パス挿入を使用した空の表へのSELECT、およびCREATE TABLE AS SELECT 。

ここには 2 つの重要なポイントがあります。

  • テーブルは空である必要があります
  • 直接パスの挿入が必要です (nologging かどうかは関係ありません)

実は、次の文があります。

たとえば、sales が空のパーティション テーブルで、INSERT INTO sales SELECT を実行すると、データベースは sales のグローバル統計を収集します。ただし、データベースはパーティション レベルの統計を収集しません。

つまり、パーティション化されたテーブルの場合、グローバル統計のみが収集され、パーティション レベルの統計は収集されません。

実験を始めましょう。

SSB スキーマに新しいテーブル (ファクト テーブル) を作成します。この時点で、統計は空です。

-- 新建表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

直接パスの挿入、統計情報を使用するため、追加の情報を収集する必要はありません。

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

パーティション実験に基づいて、テーブルを削除して再構築します.この時点では、グローバル統計は存在しません:

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
---------- ----------- ------------------- ------------------------------

パーティションレベルの統計は存在しません:

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.

ダイレクト・パスはデータを挿入し、グローバル統計は使用可能ですが、パーティション・レベルの統計はまだ存在しません:

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.

統計情報を再収集すると、パーティション レベルの統計情報も利用できるようになりました。

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.

参考

おすすめ

転載: blog.csdn.net/stevensxiao/article/details/130366040