修改oracle 的統計資訊
修改表/索引的統計資訊
資料庫在重新分析後,統計資訊可能會影響到現有的執行計劃,
影響到程式碼的執行效率。
還有一個情況是, 我們需要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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【統計資訊】Oracle統計資訊Oracle
- 【統計資訊】Oracle常用的收集統計資訊方式Oracle
- ORACLE表統計資訊與列統計資訊、索引統計資訊Oracle索引
- Oracle收集統計資訊Oracle
- Oracle 統計資訊介紹Oracle
- [統計資訊系列7] Oracle 11g的自動統計資訊收集Oracle
- Oracle統計資訊的收集和維護Oracle
- 【ASK_ORACLE】Oracle如何恢復舊的統計資訊Oracle
- Oracle錶的歷史統計資訊檢視Oracle
- oracle 統計資訊檢視與收集Oracle
- 【STATS】Oracle遷移表統計資訊Oracle
- 【SCRIPT】Oracle統計資訊相關SQLOracleSQL
- Oracle運維指令碼-收集統計資訊Oracle運維指令碼
- Oracle 統計資訊相關命令彙總Oracle
- 【DBMS_STATUS】Oracle控制優化器統計資訊的使用Oracle優化
- [20221012]修改統計資訊最佳化sql語句.txtSQL
- Oracle優化案例-擴充套件統計資訊(十四)Oracle優化套件
- 【STAT】Oracle 表統計資訊被鎖,如何建立索引Oracle索引
- Oracle優化案例-統計資訊對執行計劃的影響(十三)Oracle優化
- [20221216]建立修改表統計資訊minmaxtab.sql指令碼.txtSQL指令碼
- [20221216]建立修改表統計資訊modtab.sql指令碼.txtSQL指令碼
- 【STATS】Oracle匯入匯出優化器統計資訊Oracle優化
- ORACLE19c新特性-實時統計資訊收集Oracle
- Oracle 9i統計資訊備份與恢復Oracle
- Oracle 11g系統自動收集統計資訊的一些知識Oracle
- 【TUNE_ORACLE】定製化收集統計資訊SQL參考OracleSQL
- 修改系統時間對oracle的影響Oracle
- 【TUNE_ORACLE】檢視錶,列和索引的統計資訊SQL參考Oracle索引SQL
- Oracle資料遷移後由列的直方圖統計資訊引起的執行計劃異常Oracle直方圖
- 【統計資訊】全面檢視錶所有統計資訊SQLSQL
- 【統計資訊】如何備份和還原統計資訊
- [20221216]建立修改表欄位統計資訊modcol.sql指令碼.txtSQL指令碼
- 【TUNE_ORACLE】檢查統計資訊是否過期SQL參考OracleSQL
- 成為MySQL DBA後,再看ORACLE資料庫(十四、統計資訊與執行計劃)MySqlOracle資料庫
- oracle資料庫連續相同資料的統計方法Oracle資料庫
- git 修改 commit 資訊GitMIT
- 使用NID修改Oracle資料庫名Oracle資料庫
- 收集統計資訊方案