聚簇因子(clusteringfactor) 用來描述乙個表中的列是否是規則排序的。它的演算法如下:
我們知道可以通過dbms_rowid.rowid_block_number(rowid)找到記錄對應的block 號。索引中記錄了rowid,因此oracle 就可以根據索引中的rowid來判斷記錄是否是在同乙個block 中。舉個例子,比如說索引中有a,b,c,d,e五個記錄,首先比較a,b 是否在同乙個block,如果不在同乙個block 那麼clusteringfactor +1,然後繼續比較b,c同理,如果b,c 不在同乙個block,那麼clusteringfactor+1,這樣一直進行下去,直到比較了所有的記錄。根據演算法我們就可以知道clusteringfactor 的值介於block數和表行數之間。如果clusteringfactor 接近block數,說明表的儲存和索引儲存排序接近,也就是說表中的記錄很有序,這樣在做indexrange scan 的時候能,讀取少量的datablock 就能得到我們想要的資料,代價比較小。如果clusteringfactor 接近表記錄數,說明表的儲存和索引排序差異很大,在做indexrange scan 的時候,會額外讀取多個block,因為表記錄分散,代價較高。
sql優化時聚簇因子用得太少
舉個例子實戰中如何用的
假設索引掃瞄時要掃瞄1000條記錄
我現在把1000條記錄找到了
是不是要根據1000條記錄所對應的rowid去訪問原表??
假設聚簇因子很低 1000個rowid都在同乙個塊中
回表時掃瞄多少次?1000對吧
第一次是物理讀後面999次都在記憶體中讀走邏輯讀
假設1000個rowid分別在1000個塊中
是不是1000次均為物理讀??
假設沒cache 讀記憶體的速度是讀磁碟速度的多少倍??
請問重建索引能否降低聚簇因子??
聚簇因子是衡量表中資料分布情況
如何改變聚簇因子??
create table as select ... order by ...
聚簇因子到底幹嘛的?
聚簇因子很高我走全表掃瞄有沒有影響??
那聚簇因子肯定跟索引掃瞄有關
如果是indexunique scan 聚簇因子會不會影響??
聚簇因子有影響只能在分會多條記錄的情況下才能起作用
如 rangescan、fullscan、skipscan等fast full scan不是的
把錶都keep到keep pool裡
如果遇到聚簇因子與表的行數接近的這種索引如何處理??
一般情況下聚簇因子調優沒法做所以聚簇因子不實用
總結:聚簇因子是用來衡量索引掃瞄時通過rowid回表i/o的物理次數
sql優化的最終目的---較少物理i/0 其次較少邏輯i/o
較少物理i/o 是因為物理i/o是最耗費時間的
較少邏輯i/o 則是減少cbc爭用因為讀乙個block 就會引發乙個latch
Oracle 聚簇因子概念及實驗
oracle 聚簇因子 oracle中,對於同乙個查詢語句,有時候會很快的完成,有時候卻很慢,但是表結構什麼的完全一致,表中的資料也完全一致,這個具體是什麼原因呢,就要從index中的細節說起了。在oracle中的乙個特殊的檢視user indexes中有乙個特殊的列,名字是clustering f...
聚簇索引和非聚簇索引
一 聚簇索引 clustered indexes 的使用 聚簇索引是一種對磁碟上實際資料重新組織以按指定的乙個或多個列的值排序。由於聚簇索引的索引頁面指標指向資料頁面,所以使用聚簇索引查詢資料幾 乎總是比使用非聚簇索引快。每張表只能建乙個聚簇索引,並且建聚簇索引需要至少相當該錶120 的附加空間,以...
聚簇索引和非聚簇索引
一 聚簇索引 clustered indexes 的使用 聚簇索引是一種對磁碟上實際資料重新組織以按指定的乙個或多個列的值排序。由於聚簇索引的索引頁面指標指向資料頁面,所以使用聚簇索引查詢資料幾乎總是比使用非聚簇索引快。每張表只能建乙個聚簇索引,並且建聚簇索引需要至少相當該錶120 的附加空間,以存...