Oracle批量导入数据时的在线统计信息收集

Posted dingdingfish

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle批量导入数据时的在线统计信息收集相关的知识,希望对你有一定的参考价值。

简介

Online Statistics Gathering for Bulk Loads功能是12cR1开始支持的功能,也称为在线统计信息收集。在线统计信息收集通过消除用户在加载后收集统计信息的干预以及通过删除单独的统计信息收集操作所需的额外全表扫描来提高批量加载操作的性能和可管理性。

如何确定其已生效

NOTES字段里显示统计信息是在加载时收集的:

col table_name for a16
col column_name for a16
col notes for a16
select table_name, column_name, notes from user_tab_col_statistics where table_name = 'LINEORDER';

TABLE_NAME       COLUMN_NAME      NOTES
---------------- ---------------- ----------------
LINEORDER        LO_SHIPMODE      STATS_ON_LOAD
LINEORDER        LO_COMMITDATE    STATS_ON_LOAD
LINEORDER        LO_TAX           STATS_ON_LOAD
LINEORDER        LO_SUPPLYCOST    STATS_ON_LOAD
LINEORDER        LO_REVENUE       STATS_ON_LOAD
LINEORDER        LO_DISCOUNT      STATS_ON_LOAD
LINEORDER        LO_ORDTOTALPRICE STATS_ON_LOAD
LINEORDER        LO_EXTENDEDPRICE STATS_ON_LOAD
LINEORDER        LO_QUANTITY      STATS_ON_LOAD
LINEORDER        LO_SHIPPRIORITY  STATS_ON_LOAD
LINEORDER        LO_ORDERPRIORITY STATS_ON_LOAD
LINEORDER        LO_ORDERDATE     STATS_ON_LOAD
LINEORDER        LO_SUPPKEY       STATS_ON_LOAD
LINEORDER        LO_PARTKEY       STATS_ON_LOAD
LINEORDER        LO_CUSTKEY       STATS_ON_LOAD
LINEORDER        LO_LINENUMBER    STATS_ON_LOAD
LINEORDER        LO_ORDERKEY      STATS_ON_LOAD

17 rows selected.

从SQL monitor报告中,也可以看到OPTIMIZER STATISTICS GATHERING关键字。

不收集统计信息节省的时间


如果用NO_GATHER_OPTIMIZER_STATISTICS hint在数据加载时禁止统计数据收集,加载时间由Elapsed: 00:05:21.49变为Elapsed: 00:04:44.94,节省了37秒。不过还是建议收集的,因为如果后续收集,消耗的时间更长。

全局(表级)的统计信息肯定是收集了,但分区级别的没有:

col partition_name for a36
select last_analyzed,partition_name from dba_tab_partitions where table_name='LINEORDER';
LAST_ANAL PARTITION_NAME
--------- ------------------------------------
          P1992
          P1993
          P1994
          P1995
          P1996
          P1997
          P1998

7 rows selected.

具体收集了哪些统计信息

分区概要统计信息(synopses)没有搜集:

SQL> SELECT dbms_stats.get_prefs(pname=>'INCREMENTAL', tabname=>'LINEORDER') FROM dual;

DBMS_STATS.GET_PREFS(PNAME=>'INCREMENTAL',TABNAME=>'LINEORDER')
--------------------------------------------------------------------------------
FALSE

直方图(Histograms )统计信息也没有收集。

后续收集耗时约12分钟:

SQL> exec dbms_stats.gather_table_stats(null, 'LINEORDER');

PL/SQL procedure successfully completed.

Elapsed: 00:11:42.51

这回把分区级别的统计信息收集齐了。

SQL> select last_analyzed,partition_name from dba_tab_partitions where table_name='LINEORDER';

LAST_ANAL PARTITION_NAME
--------- ------------------------------------
24-OCT-22 P1992
24-OCT-22 P1993
24-OCT-22 P1994
24-OCT-22 P1995
24-OCT-22 P1996
24-OCT-22 P1997
24-OCT-22 P1998

7 rows selected.

参考

  • Online Statistics Gathering for Bulk Loads (文档 ID 2019634.1)
  • 10.3.3.1 Online Statistics Gathering for Bulk Loads
  • https://apex.oracle.com/database-features/
  • https://blogs.oracle.com/optimizer/post/efficient-statistics-maintenance-for-partitioned-tables-using-incremental-statistics-part-1
  • https://smarttechways.com/2017/02/07/partition-stats-info-in-oracle/

以上是关于Oracle批量导入数据时的在线统计信息收集的主要内容,如果未能解决你的问题,请参考以下文章

关于实时统计 oracle 19c 仅适用于特定表

oracle收集统计信息无法开并行

oracle11g怎么不自动收集统计信息

Oracle里收集与查看统计信息的方法

oracle中的统计信息问题

ORACLE 收集统计信息