2014年8月20日 星期三
Oracle 12c - Online Statistics Gathering for Bulk-Load 資料批量新增的在線資訊收集
在12C 提出來的新功能 資料批量新增自動收集資訊 Online Statistics Gathering for Bulk-Load
通過這個功能, 在進行某項操作例如:create table as select 或是 insert into .. select * from table,統計資訊會自動的收集
這個功能可以節省一次手動執行analyze的步驟,也可能的減少前面幾次 full table scan,對於Table經常性大量新增資料的資料庫是有不錯的幫助
在對Table進行 Online Statistics Gathering for Bulk-Load 時,Oacle 是不會自動對 index 收集資訊以及直方圖,要是有這個需求,必須還要再進行 DBMS_STATS.GATHER_TABLE_STATS 一次
這個功能還是有所限制的,根據官方的文件說明限制有
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.
Its statistics are locked.
It is partitioned, INCREMENTAL is set to true, and extended syntax is not used.
It is loaded using a multitable insert statement.
PS:12C預設是把這個功能開啟的
以下是做的簡單測試
SQL> create table test_online as select * from dba_objects ;
已建立表格.
目前歷時: 00:00:01.68
SQL> select num_rows,blocks,last_analyzed
2 from dba_tables where table_name ='TEST_ONLINE';
NUM_ROWS BLOCKS LAST_ANALYZED
---------- ---------- --------------
90855 1560 20-8月 -14
目前歷時: 00:00:00.12
SQL> alter session set "_optimizer_gather_stats_on_load"=false;
已更改階段作業.
目前歷時: 00:00:00.00
SQL> create table test_online2 as select * from dba_objects ;
已建立表格.
目前歷時: 00:00:01.17
SQL> select num_rows,blocks,last_analyzed
2 from dba_tables where table_name ='TEST_ONLINE2';
NUM_ROWS BLOCKS LAST_ANALYZED
---------- ---------- --------------
目前歷時: 00:00:00.28
SQL>
這邊可以看到開啟參數後 create table 速度降低, 為了能自動收集資訊看來還是有所犧牲的
在官方的說明文件裡還有提到, insert 要使用Online Statistics Gathering for Bulk-Load 時 必須使用加上 /*+APPEND */ hint.
以下是簡單的測試
SQL> create table test_online3 (t1 number, t2 varchar2(200));
已建立表格.
目前歷時: 00:00:00.04
SQL> insert into test_online3 select 11,'123'
2 from dual connect by level<=9000;
已建立 9000 個資料列.
目前歷時: 00:00:00.11
SQL> select num_rows,blocks,last_analyzed
2 from dba_tables where table_name ='TEST_ONLINE3';
NUM_ROWS BLOCKS LAST_ANALYZED
---------- ---------- -------------------
目前歷時: 00:00:00.03
SQL>
SQL> create table test_online4 (t1 number, t2 varchar2(200));
已建立表格.
目前歷時: 00:00:00.01
SQL> insert /*+ append */ into test_online4 select 11,'123'
2 from dual connect by level<=9000;
已建立 9000 個資料列.
目前歷時: 00:00:00.11
SQL> select num_rows,blocks,last_analyzed
2 from dba_tables where table_name ='TEST_ONLINE4';
NUM_ROWS BLOCKS LAST_ANALYZED
---------- ---------- -------------------
9000 100 2014-08-20 04:12:23
目前歷時: 00:00:00.04
SQL>
訂閱:
張貼留言 (Atom)
沒有留言:
張貼留言