日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

oracle loop index,oracle index 聚集因子

發布時間:2023/12/13 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 oracle loop index,oracle index 聚集因子 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

簡單看一下clustering_factor

簡單的說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對于oracle 優化器計算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

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的oracle loop index,oracle index 聚集因子的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。