臨時表(GLOBAL TEMPORARY TABLE)及統計資訊收集,動態取樣

tolywang發表於2012-11-08
       

我們對臨時表進行查詢時,分析執行計劃會發現臨時表估計的返回值很多情況下都是1,這顯然
是不對的(因為可能在查詢過程中臨時表的資料達到幾千甚至幾萬筆),但臨時表的資料很快
消失,那麼如何在臨時表與其他永久表聯合查詢時能正確得到較好的執行計劃呢 ? 

在臨時表上也是會執行動態取樣的,但是動態取樣在SQL解析時完成,所以存在相當大的代價。
所以一般可以使用DBMS_STATS提前收集統計資訊。
1. 可以使用GATHER_SCHEMA_STATS或GATHER_TABLE_STATS呼叫來使用DBMS_STATS。傳入
   引數GATHER_TEMP為TRUE(預設為FALSE)。但是要保證在收集統計資訊的會話中用代表
   性資料填充全域性臨時表。
   此外,這個方法只對ON COMMIT PRESERVE ROWS全域性臨時表收集和儲存統計資訊。對
   於ON COMMIT DELETE ROWS全域性臨時表收集不到正確的統計資訊。因為呼叫DBMS_STATS
   將導致提交,而這會擦除ON COMMIT DELETE ROWS表中的所有資訊。
2. 如果我們不能保證在收集統計資訊的會話中用代表性資料填充全域性臨時表,也可以
   手動填充臨時表的統計資訊(注意是代表性資料):
語法:
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;
最後使用
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,這裡初略說一下。
初始化引數optimizer_dynamic_sampling的值(或層級)指定動態取樣的方式和時間。
動態取樣等級以及含義,注意這個引數的預設值由另一個初始化引數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_dynamic_sampling=0;
 
動態取樣的統計資訊存在哪裡 ?
動態取樣得到的統計資訊既不儲存在資料字典中也不儲存在其他地方,真正重用它們的唯
一方式是重用共享遊標本身。
 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/35489/viewspace-748730/,如需轉載,請註明出處,否則將追究法律責任。

相關文章