oracle index 聚集因子
簡單的說CLUSTERING_FACTOR 用於INDEX 的有序度和表的混亂度之間比較
b*tree index是經過排序的
例如 INDEX中 記錄的第一個rowid指向 表所在DATAFILE 中 BLOCK#1 第1行 計數器 記為1,第2個rowid 指向 BLOCK#2 由於改變了塊 所以 計數器加1 ,INDEX 第3個rowid
指向BLOCK#2 塊沒變 所以計數器還為2,接著沿INDEX執行 第4個rowid 指向BLOCK#1 塊又變了計數器加1
計數器對應著CLUSTERING_FACTOR 計數器每次從一個塊到另一個新塊時候加1 這樣CLUSTERING_FACTOR也加一
所以clustering_factor可以描述資料在表中的散佈方式
如果clustering_factor接近表中的行數,大多行都不在同一個塊中,分佈太散
當clustering_factor接近表中的塊數,說明資料集中有序
當用INDEX 獲取一行以上資料時(INDEX RANGE SCAN),需要遍歷INDEX的一部分 叫INDEX的 X%,掃描INDEX 時必須逐行的讀取表,那麼當遍歷INDEX 的 X%時,轉換表塊的次數就等於clustering_factor 的 X%
另外clustering_factor對於 最佳化器計算index cost 有直接關係
cost =
blevel +
ceiling(leaf_blocks * effective index selectivity) +
ceiling(clustering_factor * effective table selectivity)
今天讀troubleshooting oracle performance 找到一個直接獲取clusering_factor的函式指令碼特此記錄,仔細看可以發現 計算方式與上面的理論是一樣的
SQL> show user
USER is "XH"
SQL> create table t3 (a int ,b int);
Table created.
SQL> declare
2 begin
3 for i in 1..10000 loop
4 insert into t3 values(i,i+1);
5 end loop;
6 commit;
7 end;
8 /
PL/SQL procedure successfully completed.
SQL> create index t3_ind on t3(a);
Index created.
SQL> select clustering_factor from user_ind_statistics where index_name='T3_IND';
CLUSTERING_FACTOR
-----------------
18
SQL> CREATE OR REPLACE FUNCTION clustering_factor (
2 p_owner IN VARCHAR2,
3 p_table_name IN VARCHAR2,
4 p_column_name IN VARCHAR2
5 ) RETURN NUMBER IS
6 l_cursor SYS_REFCURSOR;
7 l_clustering_factor BINARY_INTEGER := 0;
8 l_block_nr BINARY_INTEGER := 0;
9 l_previous_block_nr BINARY_INTEGER := 0;
10 l_file_nr BINARY_INTEGER := 0;
11 l_previous_file_nr BINARY_INTEGER := 0;
12 BEGIN
13 OPEN l_cursor FOR
14 'SELECT dbms_rowid.rowid_block_number(rowid) block_nr, '||
15 ' dbms_rowid.rowid_to_absolute_fno(rowid, '''||
16 p_owner||''','''||
17 p_table_name||''') file_nr '||
18 'FROM '||p_owner||'.'||p_table_name||' '||
19 'WHERE '||p_column_name||' IS NOT NULL '||
20 'ORDER BY ' || p_column_name;
21 LOOP
FETCH l_cursor INTO l_block_nr, l_file_nr;
22 23 EXIT WHEN l_cursor%NOTFOUND;
24 IF (l_previous_block_nr <> l_block_nr OR l_previous_file_nr <> l_file_nr)
25 THEN
26 l_clustering_factor := l_clustering_factor + 1;
27 END IF;
28 l_previous_block_nr := l_block_nr;
29 l_previous_file_nr := l_file_nr;
30 END LOOP;
31 CLOSE l_cursor;
32 RETURN l_clustering_factor;
33 END;
34 /
Function created.
SQL> select clustering_factor('XH','T3','A') from dual;
CLUSTERING_FACTOR('XH','T3','A')
--------------------------------
18
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/9907339/viewspace-1054839/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- oracle聚集函式排序Oracle函式排序
- ORACLE 聚簇因子優化Oracle優化
- Oracle自定義聚集函式Oracle函式
- Oracle自定義聚集函式薦Oracle函式
- oracle index unusableOracleIndex
- oracle document indexOracleIndex
- Oracle Index InternalsOracleIndex
- 【Oracle】global index & local index的區別OracleIndex
- oracle index索引原理OracleIndex索引
- zt_oracle indexOracleIndex
- oracle hint_no_indexOracleIndex
- oracle index monitoringOracleIndex
- oracle hints index格式OracleIndex
- oracle hint之full,index,index_asc,index_desc,index_combile示例OracleIndex
- oracle 10g 新增:自定義聚集函式Oracle 10g函式
- oracle hint之hint_index_ffs,index_joinOracleIndex
- ORACLE中index的rebuildOracleIndexRebuild
- oracle invisible index與unusable index的區別OracleIndex
- [轉]聚集索引和非聚集索引的區別索引
- 使用聚集索引和非聚集索引的區別索引
- Oracle索引分裂(Index Block Split)Oracle索引IndexBloC
- oracle hint_no_parallel_no_parallel_indexOracleParallelIndex
- oracle hint_parallel_parallel_indexOracleParallelIndex
- Oracle alter index rebuild 說明OracleIndexRebuild
- [轉載]oracle_Bitmap IndexOracleIndex
- oracle INDEX BY Pl/sql陣列OracleIndexSQL陣列
- Oracle的Index-3(轉)OracleIndex
- Oracle的Index-2(轉)OracleIndex
- Oracle的Index-1(轉)OracleIndex
- Oracle筆記 之 索引(index)Oracle筆記索引Index
- oracle 9i index bug?OracleIndex
- oracle index索引結構(一)OracleIndex索引
- oracle dml與索引index(一)Oracle索引Index
- mysql關於聚集索引、非聚集索引的總結MySql索引
- SQL Server 聚集索引和非聚集索引的區別SQLServer索引
- 【TUNE_ORACLE】Oracle索引設計思想(三)過濾因子概述與計算Oracle索引
- 多因子模型模型
- 【TUNE_ORACLE】檢視索引的叢集因子SQL參考Oracle索引SQL