如果你的系統需要在一張很大的表上建立一個索引,你會考慮哪些因素?

darren__chan發表於2020-01-16

如果你的系統需要在一張很大的表上建立一個索引,你會考慮哪些因素?

 1)關於大表建立索引,如果從綜合考慮多個維度來看,我會考慮:

1. 為什麼需要建立索引,即索引建立的之後的效能是否能夠提升

2. 建立什麼樣的索引,即索引的型別

3. 建立索引的影響,此時需要了解索引的建立過程,以及如果最佳化索引的建立效率以減少對業務的影響

4. 什麼時候建立索引

5. 有沒有其他方式來替代這個過程

 2)以下關於幾種考慮因素的分析過程:
1.為什麼需要建立索引

A. 結合應用查詢場景,比如是否存在相應關鍵業務的SQL需要使用到索引相關欄位的條件,其SQL執行頻繁是否較大;該部分業務SQL根據索引所返回的結果集大小,比如一個表有一個億,每次根據相應條件返回了幾千萬的結果集,那建立該索引是否真正有效

B. 結合表資料分佈情況,第一個是列資料選擇性問題,如果選擇性不高,有時索引回表的cost比全表掃描大,最佳化器選擇執行計劃路徑是可能不選擇索引。第二個列資料較為無序,導致建立索引後叢集因子較高,增加索引回表成本等。

C. 結合表資料變化情況,,增加一個索引便需要多維護一個索引,對一張資料變化頻率較高的表,索引太多會增加dml操作特別是insert時的索引維護成本,影響執行效率

   2.建立什麼樣的索引

      A.如果使用多個條件便可以建立複合索引

      B.如果業務sql條件存在函式,那就要考慮函式索引

      C.如果一個列基數較低,那是否考慮選擇點陣圖索引,前提是其列資料很少更新

      D.分割槽表是否建立本地索引

   3.建立索引的影響

       我們都知道建立索引會與dml操作相互影響以及還有大量的IO操作等。

   首先,是瞭解建立索引的過程,才能解決建立索引帶來的問題,我做了個建立索引的實驗,並透過10046追蹤,建立索引的主要過程如下:

A. 開始讀取資料字典如統計資訊,物件資訊等

B. 使用share mode nowait將表鎖住,此時其他會話只可讀該表但無法修改該表。

 

C. 讀取一些資訊等判斷後在obj$初始化索引物件資訊

 

  D.開始抓取表資料等一系列大量IO操作,該過程時間相對較長:

 

 

E.往seg$,icol$,ind$等資訊表中插入相應資訊

 

 

 

 

完成整個索引排序建立索引,掃描表

 

 

從以上索引的建立過程,我們可以考慮的問題點總結是:

   A.此過程會加共享鎖以至於阻塞dml操作,因此建立索引儘量選擇業務空閒期進行,同時也可以考慮online方式建立。

  B.此過程需要大量讀取表資料並排序操作,以及insert update操作,此時需要考慮儲存IO效能

  C.此過程會產生大量redo,可以考慮nologing模式

  D.同時需要考慮索引的空間大小,關注表空間和臨時表空間

  E.同時可以使用並行加快操作,這也是我們常做的。

 

4. 什麼時候建立索引

     不用考慮,業務空閒期

 

5. 有沒有其他方式來替代這個過程

可以考慮資料遷移方式,建立一張新表新增索引,線上遷入資料後 rename表

 


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

相關文章