檢視錶和索引碎片情況相關資訊

zhcunique發表於2021-03-01
  1. 查詢碎片程度高的表(可以收縮的表)
    SELECT TABLE_NAME,(BLOCKS*8192/1024/1024)"理論大小M",
    (NUM_ROWS*AVG_ROW_LEN/1024/1024/0.9)"實際大小M",
    round((NUM_ROWS*AVG_ROW_LEN/1024/1024/0.9)/(BLOCKS*8192/1024/1024),3)*100||'%' "實際使用率%"
    FROM DBA_TABLES where blocks>100 and (NUM_ROWS*AVG_ROW_LEN/1024/1024/0.9)/(BLOCKS*8192/1024/1024)<0.3
    order by (NUM_ROWS*AVG_ROW_LEN/1024/1024/0.9)/(BLOCKS*8192/1024/1024) desc

  2. 查詢索引碎片的比例
    索引刪除行數除以索引總行數的百分比>30%即認為索引碎片大,也就是需要重建的索引。
    select name,
           del_lf_rows,
           lf_rows,
           round(del_lf_rows / decode(lf_rows, 0, 1, lf_rows) * 100, 0) || '%' frag_pct
      from index_stats
     where round(del_lf_rows / decode(lf_rows, 0, 1, lf_rows) * 100, 0) > 30;

  3. 叢集因子clustering_factor高的表
    select tab.table_name,tab.blocks,tab.num_rows,ind.index_name,ind.clustering_factor,
    round(nvl(ind.clustering_factor,1)/decode(tab.num_rows,0,1,tab.num_rows),3)*100||'%' "叢集因子接近行數"
    from dba_tables tab, dba_indexes ind where tab.table_name=ind.table_name
    and tab.blocks>100
    and nvl(ind.clustering_factor,1)/decode(tab.num_rows,0,1,tab.num_rows) between 0.35 and 3

  4. 附:聚簇因子(Clustering factor)簡介
    聚簇因子是 Oracle 統計資訊中在CBO最佳化器模式下用於計算cost的引數之一,決定了當前的SQL語句是否走索引,還是全表掃描以及是否作為巢狀連線外部表等
    1)堆表的儲存方式
    Oralce 資料庫系統中最普通,最為常用的即為堆表。
    堆表的資料儲存方式為無序儲存,也就是任意的DML操作都可能使得當前資料塊存在可用的空閒空間。
    處於節省空間的考慮,塊上的可用空閒空間會被新插入的行填充,而不是按順序填充到最後被使用的塊上。
    上述的操作方式導致了資料的無序性的產生。
    當建立索引時,會根據指定的列按順序來填充到索引塊,預設的情況下為升序。
    新建或重建索引時,索引列上的順序是有序的,而表上的順序是無序的,也就是存在了差異,即表現為聚簇因子。
    2)什麼是聚簇因子(clustering factor/CF)
    聚簇因子是基於表上索引列上的一個值,每一個索引都有一個聚簇因子。
    用於描述索引塊上與表塊上儲存資料在順序上的相似程度,也就說表上的資料行的儲存順序與索引列上順序是否一致。
    在全索引掃描中,CF的值基本上等同於物理I/O或塊訪問數,如果相同的塊被連續讀,則Oracle認為只需要1次物理I/O。
    好的CF值接近於表上的塊數,而差的CF值則接近於表上的行數。
    聚簇因子在索引建立時就會透過表上存存在的行以及索引塊計算獲得。
    3)Oracle 如何計算聚簇因子
    執行或預估一次全索引掃描。
    檢查索引塊上每一個rowid的值,檢視是否前一個rowid的值與後一個指向了相同的資料塊,如果指向了不相同的資料塊則CF的值增加1。
    當索引塊上的每一個rowid被檢查完畢,即得到最終的CF值。
    4)提高聚簇因子
    堆表的資料儲存是無序儲存,因此需要使無序變為有序。下面是提高聚簇因子的辦法。
    a、對於表上的多個索引以及組合索引的情形,索引的建立應考慮按應該按照經常頻繁讀取的大範圍資料的讀取順序來建立索引。
    b、定期重構表(針對堆表),也就是使得表與索引上的資料順序更接近。注意,是重構表,而不是重建索引。
    重建索引並不能顯劇提高CF的值,因為索引列通常是有序的,無序的是原始表上的資料。
    提取原始表上的資料到一個臨時表,禁用依賴於該表的相關約束,truncate原始表,再將臨時表的資料按索引訪問順序填充到原始表。
    c、使用聚簇表來代替堆表。

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

相關文章