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/
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值