臨時表(GLOBAL TEMPORARY TABLE)及統計資訊收集,動態取樣
我們對臨時表進行查詢時,分析執行計劃會發現臨時表估計的返回值很多情況下都是1,這顯然
是不對的(因為可能在查詢過程中臨時表的資料達到幾千甚至幾萬筆),但臨時表的資料很快
消失,那麼如何在臨時表與其他永久表聯合查詢時能正確得到較好的執行計劃呢 ?
在臨時表上也是會執行動態取樣的,但是動態取樣在SQL解析時完成,所以存在相當大的代價。
所以一般可以使用DBMS_STATS提前收集統計資訊。
1. 可以使用GATHER_SCHEMA_STATS或GATHER_TABLE_STATS呼叫來使用DBMS_STATS。傳入
引數GATHER_TEMP為TRUE(預設為FALSE)。但是要保證在收集統計資訊的會話中用代表
性資料填充全域性臨時表。
引數GATHER_TEMP為TRUE(預設為FALSE)。但是要保證在收集統計資訊的會話中用代表
性資料填充全域性臨時表。
此外,這個方法只對ON COMMIT PRESERVE ROWS全域性臨時表收集和儲存統計資訊。對
於ON COMMIT DELETE ROWS全域性臨時表收集不到正確的統計資訊。因為呼叫DBMS_STATS
將導致提交,而這會擦除ON COMMIT DELETE ROWS表中的所有資訊。
於ON COMMIT DELETE ROWS全域性臨時表收集不到正確的統計資訊。因為呼叫DBMS_STATS
將導致提交,而這會擦除ON COMMIT DELETE ROWS表中的所有資訊。
2. 如果我們不能保證在收集統計資訊的會話中用代表性資料填充全域性臨時表,也可以
手動填充臨時表的統計資訊(注意是代表性資料):
語法:
exec dbms_stats.set_table_stats(ownname,tabname,numrows,numblks,avgrlen);
手動填充臨時表的統計資訊(注意是代表性資料):
語法:
exec dbms_stats.set_table_stats(ownname,tabname,numrows,numblks,avgrlen);
begin
dbms_stats.set_table_stats(
wnname => 'APPSYS',
tabname => 'DIM_DEL',
numrows => 300,
numblks => 4,
avgrlen => 20);
end;
或者
BEGIN dbms_stats.set_table_stats(ownname => 'SOAINFRA',tabname => 'DM_MID',numrows =>10000 );END;
dbms_stats.set_table_stats(
wnname => 'APPSYS',
tabname => 'DIM_DEL',
numrows => 300,
numblks => 4,
avgrlen => 20);
end;
或者
BEGIN dbms_stats.set_table_stats(ownname => 'SOAINFRA',tabname => 'DM_MID',numrows =>10000 );END;
最後使用
exec dbms_stats.lock_table_stats(ownname => 'XXXXX',tabname =>'XXXX');
這時會針對這個表對統計資訊鎖定,之後的analyze及dbms_stats分析對此表操作會報錯
ORA-38029: object statistics are locked。
exec dbms_stats.lock_table_stats(ownname => 'XXXXX',tabname =>'XXXX');
這時會針對這個表對統計資訊鎖定,之後的analyze及dbms_stats分析對此表操作會報錯
ORA-38029: object statistics are locked。
-- 最後簡單說說動態取樣 。
動態取樣在Oracle9i R2中被引入。
詳細可參考部落格: http://space.itpub.net/35489/viewspace-592375,這裡初略說一下。
詳細可參考部落格: http://space.itpub.net/35489/viewspace-592375,這裡初略說一下。
初始化引數optimizer_dynamic_sampling的值(或層級)指定動態取樣的方式和時間。
動態取樣等級以及含義,注意這個引數的預設值由另一個初始化引數optimizer_features_ enable決定。
動態取樣等級以及含義,注意這個引數的預設值由另一個初始化引數optimizer_features_ enable決定。
如果optimizer_features_enable設定為10.0.0或更高,預設值為層級2。大部分時候level2足夠了。
如果optimizer_features_enable設定為9.2.0,預設值為層級1。
如果optimizer_features_enable設定為9.0.1或更低,動態取樣特性則被禁用。
如果optimizer_features_enable設定為9.2.0,預設值為層級1。
如果optimizer_features_enable設定為9.0.1或更低,動態取樣特性則被禁用。
關閉動態取樣的方式: 設定optimizer_dynamic_sampling=0;
動態取樣的統計資訊存在哪裡 ?
動態取樣得到的統計資訊既不儲存在資料字典中也不儲存在其他地方,真正重用它們的唯
一方式是重用共享遊標本身。
動態取樣得到的統計資訊既不儲存在資料字典中也不儲存在其他地方,真正重用它們的唯
一方式是重用共享遊標本身。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/35489/viewspace-748730/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle臨時表GLOBAL TEMPORARY TABLEOracle
- 全域性臨時表 GLOBAL TEMPORARY TABLE
- create table進階學習(二)_全域性臨時表_global temporary table
- orace global temporary table全域性臨時表測試小記
- oracle global temporary table全域性臨時表_測試及v$tempseg_usageOracle
- 【TEMPORARY TABLE】Oracle臨時表使用注意事項Oracle
- oracle外部表建立以及收集統計資訊以及臨時表Oracle
- 全域性臨時表GTT的統計資訊收集辦法:
- oracle的兩種global temporary table!Oracle
- 微課sql最佳化(6)、統計資訊收集(4)-關於動態取樣SQL
- Oracle Temporary Tables(Oracle 臨時表)Oracle
- [Oracle] Oracle收集統計資訊的取樣比例Oracle
- 對於沒有任何統計資訊的表,ORACLE可能會動態取樣。Oracle
- oracle的臨時表空間temporary tablespaceOracle
- 【TABLE】Oracle表資訊收集指令碼Oracle指令碼
- Redo內部解析-Global Temporary table insert(九)
- Oracle 11g 建立臨時window時間視窗 收集統計資訊Oracle
- 臨時表空間temporary tablespace相關操作
- CBO與動態統計量取樣
- 資料庫表--temporary table資料庫
- 【TEMPORARY TABLE】Oracle兩種臨時表型別功能特點比較Oracle型別
- Oracle 分析及動態取樣Oracle
- 記憶體(memory)表和臨時(temporary)表之瞭解記憶體
- Oracle統計資訊自動收集Oracle
- 重新收集oracle表的統計資訊Oracle
- Oracle 11g手工收集表統計資訊Oracle
- Oracle 分析及動態取樣(轉帖)Oracle
- 修改自動收集統計資訊任務的執行時間
- 關於oracle自動收集統計資訊Oracle
- Oracle11g 統計資訊-----統計資訊自動收集任務Oracle
- Oracle11g 統計資訊——統計資訊自動收集任務Oracle
- oracle temporary tableOracle
- Oracle10新特性:臨時表空間組(temporary tablespace group)Oracle
- 10G新特性: 臨時表空間組(temporary tablespace group)
- ORACLE Temporary Tables臨時表更適合做插入和查詢操作Oracle
- Oracle收集統計資訊Oracle
- Oracle 統計資訊收集Oracle
- 收集oracle統計資訊Oracle