修改oracle 的統計資訊

babyyellow發表於2022-11-15




修改表/索引的統計資訊  






資料庫在重新分析後,統計資訊可能會影響到現有的執行計劃,


影響到程式碼的執行效率。


還有一個情況是, 我們需要oracle 在解析sql的執行計劃的時候,能夠按照我們的意願走某個索引。 


影響oracle 執行計劃的資料主要來自於表和索引的統計資訊, 


我們可以手工修改這些統計值 ,


下面的指令碼是一個修改索引統計資訊的指令碼, 


DECLARE

M_NUMROWS NUMBER;   ---紀錄的行數   

M_NUMLBLKS NUMBER;  --- 資料塊的數目

M_NUMDIST NUMBER; --number of distinct key 唯一鍵的數目,

M_AVGLBLK NUMBER; --leaf 平均塊數, 一個dist-key 的資料佔據幾個索引的葉子資料塊。

M_AVGDBLK NUMBER; --data 平均塊數, 一個dist-key 對應的資料表的塊數。

M_CLSTFCT NUMBER; --這個這個值,不太好理解,先放下

M_INDLEVEL NUMBER; --索引的level 數。

BEGIN

DBMS_STATS.GET_INDEX_STATS(OWNNAME => NULL,INDNAME => '&source_index_name',

NUMROWS => M_NUMROWS,NUMLBLKS => M_NUMLBLKS,

NUMDIST => M_NUMDIST,AVGLBLK => M_AVGLBLK,

AVGDBLK => M_AVGDBLK,CLSTFCT => M_CLSTFCT,

INDLEVEL => M_INDLEVEL);



M_CLSTFCT := M_CLSTFCT-3000;


DBMS_STATS.SET_INDEX_STATS(OWNNAME => NULL,INDNAME => '&target_index_name',

NUMROWS => M_NUMROWS,NUMLBLKS => M_NUMLBLKS,

NUMDIST => M_NUMDIST,AVGLBLK => M_AVGLBLK,

AVGDBLK => M_AVGDBLK,CLSTFCT => M_CLSTFCT,

INDLEVEL => M_INDLEVEL);

END;

/



對於唯一索引 numdist ==  numrows   key 的數目跟行數是一致的,


avglblk  =  numlblks / numdist 預設的計算方式。 


avgdblk  = clstfct  /numdist   預設的計算方式。 


ownername => null ,表示分析當前schema . 


clstfct 代表的意思,不很好表達,這個值比較重要,會影響到執行計劃的cost值, 


大體的意思就是,舉個例子: 


select name from  tab where id =1 ; 


id =1 的 資料假設分配在兩個資料塊裡(blk1 ,blk2) ,  如果 clsfct 的值很大,(這個值的計算我們以後再說) 


資料的實際計算路徑應該類似於:  先從blk1 取一筆資料,然後去 blk2裡再取一筆資料,然後兩個資料merge 


    然後再從blk1 取一筆資料,然後再從blk2取一筆資料,就這樣來回的在兩個資料塊間切換,


如果 blk1 跟blk2  是連在一起的,那麼會在一個disk i/0 中讀入記憶體,然後產生了大量的consistent get 

如果不好採, 這個資料庫塊間間隔了幾十個資料塊,那麼就會產生比較頻繁的物理i/0切換,


這個值大體的就是這個意思了。 這個對應於all_indexes 檢視的CLUSTERING_FACTOR  欄位的解釋:


Indicates the amount of order of the rows in the table based on the values of the index.


    * If the value is near the number of blocks, then the table is very well ordered. In this case, the index entries in a single leaf block tend to point to rows in the same data blocks.


    * If the value is near the number of rows, then the table is very randomly ordered. In this case, it is unlikely that index entries in the same leaf block point to rows in the same data blocks. ) 

這個值比較理想的狀態下應該跟 numblk 的數量查不多。 



等對這個東西看的差不多了,再寫個文件,先這樣看著吧。 




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

相關文章