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批量导入数据时的在线统计信息收集的主要内容,如果未能解决你的问题,请参考以下文章