Oracle database 12c中提出了Online Statistics Gathering for Bulk-Load 針對批量資料載入的線上統計資訊收集的新特性。



通過online statistics gathering,當出現某些批量資料載入操作例如CREATE TABLE AS SELECT CTAS操作 或者 針對一個空表的INSERT INTO ... SELECT操作時,統計資訊將被自動收集。




online statistics gathering省略了當一個批量資料載入後的必要手動統計資訊收集操作; 大家還記得我們在講10/11g 性能調優時 關於資料量大幅變化操作後的手動收集統計資訊建議嗎? 實際上這個特性一定程度就是為了解決這裡還需要手動去收集一次的麻煩。 這個特性表現的很像之前的CREATE INDEX或REBUILD INDEX時自動完成的統計資訊收集。 Oracle通過內部維護操作來維護CTAS或物化視圖刷新的統計資訊更新 。




在資料倉儲中,使用者經常需要載入大量的資料到資料庫中; 這裡online statistics gathering 就可以起到作用。

 

Oracle Database 12c中預設啟用這種自動統計資訊收集特性,主要的收益在於提升批量載入資料後的SQL性能和可管理性,不在需要使用者介入來人工收集了。 由於不在需要手動收集統計資訊, 所以也就避免了後續的一次可能的全資料表掃描。

 

當使用Online Statistics Gathering時,資料庫不收集索引統計資訊和長條圖。如果確實需要索引統計資訊和長條圖,則Oracle推薦在批量載入資料後再次使用DBMS_STATS.GATHER_TABLE_STATS。 預設情況下 DBMS_STATS.GATHER_TABLE_STATS僅收集缺失的統計資訊,因此當你在bulk load批量載入後執行DBMS_STATS.GATHER_TABLE_STATS,資料庫將僅僅收集索引統計資訊和長條圖histograms, 而表和欄位的統計資訊將不再被收集。




補充1點: SYS使用者的物件不啟用Online Statistics Gathering,不要使用SYS使用者去測試該特性。




Online Statistics Gathering for Bulk-Load 的其他限制:




It is in an Oracle-owned schema such as SYS.
It is a nested table.
It is an index-organized table (IOT).
It is an external table.
It is a global temporary table defined as ON COMMIT DELETE ROWS.
It has virtual columns.
It has a PUBLISH preference set to FALSE.
It is partitioned, INCREMENTAL is set to true, and extended syntax is not used.



FROM 孟買-老托拉呱的筆記:

 

在Oracle Database 12c中,如下兩種Bulk-Load方式下,系統將會自動收集表上的統計資訊
¤ CTAS – Create Table As Select ...
¤ IIS – Insert Into ... Select ...

 

說明:(1)必須是使用direct path insert到一個空表/空分區的情況下

 

(2)如果是空分區表,收集的是global statistics而不是partition-level statistics。

 

如果是插入到指定的分區/子分區(空),則收集partition-level statistics而不是global statistics。比如Insert Into sales PARTITION(sales_q1_2013) Select ...
如果在插入前,分區sales_q1_2013是空的(其他分區不論是否為空),那麼就會收集統計資訊。如果表上啟用了Incremental Statistics Maintenance屬性(11gR2開始提供的特性),那麼同時也會自動該分區的摘要(synopsis)資訊。

 

(3)如果rollback,統計資訊自動刪除。

 

(4)這個特性,不收集index statistics or histograms,所以,如果需要,Oracle推薦通過DBMS_STATS.GATHER_TABLE_STATS(options => ‘GATHER AUTO’...)
來收集index statistics or histograms。

 

這就有點象從10g版本開始create index/rebuild index自動收集統計資訊的意思了。在12c之前的版本,DBA是需要及時(資料插入之後)手工去收集Statistics,否則可能會在後面的使用中導致不正確的執行計畫的出現。








隱藏參數_optimizer_gather_stats_on_load(enable/disable online statistics gathering,預設為TRUE)控制該Online Statistics Gathering for Bulk-Load特性是否打開,預設是打開的。

 

除了設置_optimizer_gather_stats_on_load=false之外還可以通過NO_GATHER_OPTIMIZER_STATISTICS(QKSFM_DBMS_STATS)的HINT來避免使用Online Statistics Gathering特性。 與之相對的是 GATHER_OPTIMIZER_STATISTICS。




測試1: Create table AS select 耗時上啟用Online Statistics Gathering大約增加15%




view sourceprint?
01.
SQL> create table online_gather as select rownum t1, 'maclean' t2 from dual connect by level<=900000;
02.

 

03.
表已創建。
04.

 

05.
經過時間: 00: 00: 01.09
06.

 

07.
SQL> select num_rows,blocks from dba_tables where table_name='ONLINE_GATHER';
08.

 

09.
NUM_ROWS BLOCKS
10.
---------- ----------
11.
900000 2282
12.

 

13.
經過時間: 00: 00: 00.17
14.

 

15.
SQL> alter session set "_optimizer_gather_stats_on_load"=false;
16.

 

17.
會話已更改。
18.

 

19.
經過時間: 00: 00: 00.00
20.

 

21.
SQL> create table online_gather2 as select rownum t1, 'maclean' t2 from dual connect by level<=900000;
22.

 

23.
表已創建。
24.

 

25.
經過時間: 00: 00: 00.93
26.

 

27.
SQL> select num_rows,blocks from dba_tables where table_name='ONLINE_GATHER2';
28.

 

29.
NUM_ROWS BLOCKS
30.
---------- ----------
31.

 

32.
經過時間: 00: 00: 00.09





2、測試 bulk load insert





view sourceprint?
01.
conn malcean/maclean
02.

 

03.
SQL> create table online_load (t1 int, t2 Varchar2(200));
04.

 

05.
表已創建。
06.

 

07.
SQL> insert into online_load select rownum t1, 'maclean' t2 from dual connect by level<=900000;
08.

 

09.
已創建 900000 行。
10.

 

11.
SQL> commit;
12.

 

13.
提交完成。
14.

 

15.
SQL> select num_rows,blocks from dba_tables where table_name='ONLINE_LOAD';
16.

 

17.
NUM_ROWS BLOCKS
18.
---------- ----------
19.

 

20.
注意僅有INSERT APPEND的情況下才會觸發Online Statistics Gathering
21.

 

22.
SQL> create table online_load1 (t1 int, t2 Varchar2(200));
23.

 

24.
表已創建。
25.

 

26.
SQL> insert /*+ append */ into online_load1 select rownum t1, 'maclean' t2 from dual connect by level<=900000; 已創建 900000 行。 SQL> commit;
27.

 

28.
提交完成。
29.

 

30.
SQL> select num_rows,blocks from dba_tables where table_name='ONLINE_LOAD1';
31.

 

32.
NUM_ROWS BLOCKS
33.
---------- ----------
34.
900000 2282
創作者介紹
創作者 shadow 的頭像
shadow

資訊園

shadow 發表在 痞客邦 留言(0) 人氣()