久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

數據庫中如何實現全局臨時表GTT的統計信息

179次閱讀
沒有評論

共計 2612 個字符,預計需要花費 7 分鐘才能閱讀完成。

這篇文章主要介紹數據庫中如何實現全局臨時表 GTT 的統計信息,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

我們都知道,全局臨時表 GTT 分為兩種,一種是 transaction level,一種是 session level,

分別通過 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 的統計信息”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注丸趣 TV 行業資訊頻道!

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-07-20發表,共計2612字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 平乐县| 二连浩特市| 莱州市| 大洼县| 阿克陶县| 康保县| 渝中区| 冕宁县| 蒙阴县| 襄垣县| 会东县| 华宁县| 杨浦区| 房产| 南部县| 德兴市| 玉门市| 确山县| 丁青县| 铜山县| 拜泉县| 中方县| 合江县| 房山区| 固阳县| 宁德市| 忻城县| 安达市| 黔南| 苏尼特左旗| 进贤县| 金平| 庆阳市| 夏邑县| 津市市| 巴彦淖尔市| 栖霞市| 安龙县| 高密市| 凤庆县| 鱼台县|