您好,登錄后才能下訂單哦!
如果你的系統需要在一張很大的表上創建一個索引,你會考慮哪些因素?
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表
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。