一个很不错的新特性,12c中支持自动收集批量数据加载的在线统计信息采集功能,这和普通的收集统计功能主要区别就是
Oracle并不需要重新扫描一次表来收集数据,而是通过加载数据的过程中,Oracle通过内部的机制就收集好了。省了很
多资源。
1.自动收集的条件
只有在下面两个方式批量加载数据的时候会自动收集统计信息
CREATE TABLE AS SELECT
INSERT INTO ... SELECT 语句插入数据,而且是使用Direct Path Insert,通过 /*+APPEND */来实现
2.好处
1)自动收集统计信息,不会再去扫描表去收集统计信息
2)不需要手动去收集统计信息
3.插入数据到一个空的分区表中
如果roll back了事务,那么Oracle会自动删除之前自动收集的统计信息。
3.1使用INSERT INTO sales SELECT插入方式
自动收集全部数据,而不会收集分区级别的数据
3.2使用INSERT INTO sales PARTITION (sales_q4_2000) SELECT插入方式
自动收集插入那个分区或子分区的统计信息,而不会去收集全局的数据。如果该表启用了INCREMENTAL优先权,
那么Oracle会收集该分区的概要。
4.批量插入数据,收集索引和直方图统计信息
可惜这个并不会自动收集索引和直方图统计信息,如果这些数据需要收集,Oracle建议使用DBMS_STATS.GATHER_TABLE_STATS参数设置为GATHER AUTO
如:EXEC DBMS_STATS.GATHER_TABLE_STATS( user, 'SH_CTAS', options => 'GATHER AUTO' );
上面的例子只是收集丢失或过期的统计数据。数据库不收集表和批量加载过程中收集基本列统计信息。
5.在线收集统计信息的限制
1)It is not empty, and you perform an INSERT INTO ... SELECT. 2)It is in an Oracle-owned schema such as SYS. 3)It is a nested table. 4)It is an index-organized table (IOT). 5)It is an external table. 6)It is a global temporary table defined as ON COMMIT DELETE ROWS. 7)It has virtual columns. 8)It has a PUBLISH preference set to FALSE. /? Bug 16922369 ?/ 9)Its statistics are locked. 10)It is partitioned, INCREMENTAL is set to true, and extended syntax is not used. 11)It is loaded using a multitable insert statement.
6.通过hint来决定是否在线收集统计信息
/*+NO_GATHER_OPTIMIZER_STATISTICS */* 不在线收集统计信息
/*GATHER_OPTIMIZER_STATISTICS */* 在线收集统计信息
如:
CREATE TABLE employees2 AS SELECT /*+NO_GATHER_OPTIMIZER_STATISTICS */* FROM employees
12c不仅仅是云的概念,很多小的特性的加入,可能是更实用。
版权声明:本文为博主原创文章,未经博主允许不得转载。