您好,登錄后才能下訂單哦!
這篇文章主要介紹數(shù)據(jù)庫中如何實(shí)現(xiàn)全局臨時表GTT的統(tǒng)計信息,文中介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們一定要看完!
分別通過on commit delete rows/preserve rows實(shí)現(xiàn),其中session level表示在本sessoin
數(shù)據(jù)有效,相同session內(nèi),之前事務(wù)操作的數(shù)據(jù),對于后續(xù)的操作都可見,而事務(wù)級的GTT表示
一旦事務(wù)結(jié)束(commit)那么立即delete,相同session 的后續(xù)操作看不到之前事務(wù)操作。
在9i階段可以使用GATHER_TABLE_STATS調(diào)用來收集統(tǒng)計信息須傳入?yún)?shù)GATHER_TEMP為TRUE,
10g開始o(jì)racle對于普通表和GTT收集統(tǒng)計信息并沒有特殊處理,都是通過GATHER_TABLE_STATS
存儲過程來收集,但是由于上述的兩種GTT特殊性,收集統(tǒng)計信息有特殊性:
1.對于session level的,因?yàn)镚TT數(shù)據(jù)并不持久化,存在session 隔離性,需要在當(dāng)前session 收集,
若是通過另起窗口(新session)收集統(tǒng)計信息會不成功,原因就是收集統(tǒng)計信息的session 沒有數(shù)據(jù),
自然也收集不到統(tǒng)計信息了。
2.對于transaction level的,即便是當(dāng)前session 收集,因?yàn)镚ATHER_TABLE_STATS會先執(zhí)行默認(rèn)提交,
所以數(shù)據(jù)就自動刪除,自然也就沒有數(shù)據(jù)可收集了。所以針對這種情景,oracle 有官方note 403587.1介紹
下面就是移花接木辦法來收集事務(wù)級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已經(jīng)進(jìn)步改善了對這種transaction level GTT的統(tǒng)計信息收集,
也就是說GATHER_TABLE_STATS收集統(tǒng)計信息的時候不會默認(rèn)發(fā)起commit,這樣就不會
破壞當(dāng)前session的事務(wù)完整性,收集統(tǒng)計信息的存儲過程就可以看到當(dāng)前session的
數(shù)據(jù)情況并收集統(tǒng)計信息。
下面是一個簡單的測試過程:
3.1.創(chuàng)建transaction level GTT
Create Global Temporary Table maob_temp (a number,b varchar2(100)) On Commit delete Rows; <<delete Rows
Table created.
3.2.插入數(shù)據(jù)
insert into maob_temp select rownum,object_name from dba_objects where rownum<1000;
SQL>
999 rows created.
3.3.收集統(tǒng)計信息
exec dbms_stats.gather_table_stats(user,'MAOB_TEMP');
SQL>
PL/SQL procedure successfully completed.
3.4.check是否數(shù)據(jù)已經(jīng)被刪除
select count(*)from maob_temp;
SQL>
COUNT(*)
----------
999
3.5.查看統(tǒng)計信息是否已經(jīng)收集成功
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執(zhí)行,因?yàn)?2c的這個新功能默認(rèn)對GTT收集統(tǒng)計信息是session scope的,也就是說統(tǒng)計信息也是
session 隔離的,其他session 看不到這個session收集的統(tǒng)計信息,若是變成傳統(tǒng)的shared scope,那么仍然會默認(rèn)先commit再收集
統(tǒng)計信息并記錄數(shù)據(jù)字典表,供其他session 使用,對于transaction level仍然存在先commit在收集情況,那么要解決問題,仍需要參考步驟
2的移花接木辦法,但是創(chuàng)建表之后要先指定為shared scope再收集統(tǒng)計信息。
EXEC DBMS_STATS.SET_TABLE_PREFS (NULL,'TT','GLOBAL_TEMP_TABLE_STATS','SHARED');
以上是“數(shù)據(jù)庫中如何實(shí)現(xiàn)全局臨時表GTT的統(tǒng)計信息”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。