您好,登錄后才能下訂單哦!
這篇文章主要介紹數據庫中如何實現全局臨時表GTT的統計信息,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
分別通過on commit delete rows/preserve rows實現,其中session level表示在本sessoin
數據有效,相同session內,之前事務操作的數據,對于后續的操作都可見,而事務級的GTT表示
一旦事務結束(commit)那么立即delete,相同session 的后續操作看不到之前事務操作。
在9i階段可以使用GATHER_TABLE_STATS調用來收集統計信息須傳入參數GATHER_TEMP為TRUE,
10g開始oracle對于普通表和GTT收集統計信息并沒有特殊處理,都是通過GATHER_TABLE_STATS
存儲過程來收集,但是由于上述的兩種GTT特殊性,收集統計信息有特殊性:
1.對于session level的,因為GTT數據并不持久化,存在session 隔離性,需要在當前session 收集,
若是通過另起窗口(新session)收集統計信息會不成功,原因就是收集統計信息的session 沒有數據,
自然也收集不到統計信息了。
2.對于transaction level的,即便是當前session 收集,因為GATHER_TABLE_STATS會先執行默認提交,
所以數據就自動刪除,自然也就沒有數據可收集了。所以針對這種情景,oracle 有官方note 403587.1介紹
下面就是移花接木辦法來收集事務級GTT的步驟
1. create a PRESERVE ROWS table
SQL> create global temporary table TT(I number) on commit preserve rows;
2. populate with representative data
SQL> insert into TT select rownum from dba_objects where rownum<1000;
3. gather stats
SQL> exec dbms_stats.gather_table_stats(null,'TT');
4. create a STAT table
SQL> exec dbms_stats.create_stat_table(null,'TTSTATS');
5. export the stats from the PRESERVE ROWS table
SQL> exec dbms_stats.export_table_stats(null,'TT',null,'TTSTATS',null,true);
6. truncate then drop the PRESERVE ROWS table
SQL> truncate table TT;
SQL> drop table TT;
7. now create the real temporary table (defined using DELETE ROWS - the default)
SQL> create global temporary table TT(I number);
8. finally import the stats exported from the STAT table
SQL> exec dbms_stats.import_table_stats(null,'TT',null,'TTSTATS',null,true);
3.在12c版本,oracle已經進步改善了對這種transaction level GTT的統計信息收集,
也就是說GATHER_TABLE_STATS收集統計信息的時候不會默認發起commit,這樣就不會
破壞當前session的事務完整性,收集統計信息的存儲過程就可以看到當前session的
數據情況并收集統計信息。
下面是一個簡單的測試過程:
3.1.創建transaction level GTT
Create Global Temporary Table maob_temp (a number,b varchar2(100)) On Commit delete Rows; <<delete Rows
Table created.
3.2.插入數據
insert into maob_temp select rownum,object_name from dba_objects where rownum<1000;
SQL>
999 rows created.
3.3.收集統計信息
exec dbms_stats.gather_table_stats(user,'MAOB_TEMP');
SQL>
PL/SQL procedure successfully completed.
3.4.check是否數據已經被刪除
select count(*)from maob_temp;
SQL>
COUNT(*)
----------
999
3.5.查看統計信息是否已經收集成功
SQL> select TABLE_NAME,NUM_ROWS,BLOCKS,SCOPE from DBA_TAB_STATISTICS where owner='MAOB' AND TABLE_NAME='MAOB_TEMP';
TABLE_NAME NUM_ROWS BLOCKS SCOPE
--------------------------------------
MAOB_TEMP 0 0 SHARED
MAOB_TEMP 999 4 SESSION <<<<
注意:這一步要在和上述步驟相同的session執行,因為12c的這個新功能默認對GTT收集統計信息是session scope的,也就是說統計信息也是
session 隔離的,其他session 看不到這個session收集的統計信息,若是變成傳統的shared scope,那么仍然會默認先commit再收集
統計信息并記錄數據字典表,供其他session 使用,對于transaction level仍然存在先commit在收集情況,那么要解決問題,仍需要參考步驟
2的移花接木辦法,但是創建表之后要先指定為shared scope再收集統計信息。
EXEC DBMS_STATS.SET_TABLE_PREFS (NULL,'TT','GLOBAL_TEMP_TABLE_STATS','SHARED');
以上是“數據庫中如何實現全局臨時表GTT的統計信息”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。