【DB2】索引
1. 索引的概念
1.1 索引的優點
索引是表的一個或多個列的鍵值的有序列表,建立索引的原因有2個:
- 確保一個或多個列中值的唯一性
- 提高對錶進行的查詢的效能。當查詢時想要以更快的速度找到所需要的列,或要以索引的順序顯示查詢結果時,DB2優化器選擇使用索引
2. 索引型別
2.1 唯一索引和非唯一索引
唯一索引:只允許列表中出現唯一一個鍵值
非唯一索引:允許重複的鍵值
2.2 群集索引
群集索引允許對資料頁採用更線性的訪問模式,允許更有效的預取,並且有助於避免排序。這意味著插入時間久,但查詢操作會更快
使用群集索引時,應該考慮將資料頁和索引頁上的空閒空間增大為約15到35(而不是PCTFREE預設值10),以允許大容量的插入
群集索引的好處包括:
- 在每個資料分割槽內,資料頁以鍵的順序排列
- 群集索引改善了以鍵的順序掃描整張表的效能。這是因為掃描訪問第一頁的第一行,然後訪問同頁上的每一行,在訪存了該頁上的所有行之後,才移至下一頁。這樣的好處是按照index來取資料時,磁頭不會亂跑,從而提高了效能
3. 索引設計
3.1 建立索引注意事項
- 不建立冗餘索引
- 確保建立的索引被引用
- 考慮索引的維護成本
- 需要考慮索引列的順序
3.2 建立唯一性索引與非唯一性索引
CREATE INDEX <name> ON <table_name> (<column_name>)
下面是按照EMPLOYEE表中的LASTNAME建立稱為IND_LNAME並且按照升序排列的非唯一性索引
CREATE INDEX IND_LNAME ON EMPLOYEE(LASTNAME ASC)
下面是基於電話號碼列建立唯一的索引
CREATE INDEX IND_TEL ON EMPLOYEE(PHONENO DESC)
3.3 建立群集索引
Tips :DB2表資料被刪除時候,空間不會被釋放,而是在原資料上加了一個delete標誌,表示該行的空間可以使用,當需要向表中insert資料時,db2會掃描整個表空間,然後將新行置於可用的表空間,而如果指定了append on 屬性,那麼db2將不再搜尋空閒表空間,而是把資料直接插入到表的最後,這樣可以提高效率。這種適合於那些大批量追加的歷史表,使用append on 屬性後,注意定義reorg table
ALTER TABLE EMPLOYEE APPEND ON
新建群集索引
CREATE INDEX IND1_LNAME ON EMPLOYEE(LASTNAME) CLUSTER
但是上述兩種不能同時存在
否則報錯如下:
3.4 建立雙向索引
CREATE INDEX IND_FIRNAME ON EMPLOYEE(FIRSTNME DESC) ALLOW REVERSE SCANS
在這種情況下,基於給定列FIRSTNME中的遞減值形成索引。
4.完全索引訪問
CREATE INDEX語句的INCLUDE字句指定在建立索引時,可以選擇包含的附加列資料,這些附加的列資料將與索引儲存在一起,但實際上這不是鍵本身的一部分,所以不被排序,在強制執行索引的唯一性時不考慮被包含的列。
例如執行如下查詢:
SELECT EMPNO,FIRSTNME FROM EMPLOYEE
下面語句是建立一個提高效能的可能索引
CREATE UNIQUE INDEX IND_EMPNO ON EMPLOYEE(EMPNO) INCLUDE(FIRSTNME)
本質上,FIRSTNME資料是被複制儲存的,資料被更新時,副本也會被更新,對資料庫是很大的開銷。
INCLUDE只能用在建立唯一性索引中
5.建立索引相關問題
1)如果能在一個合理的時間內結束查詢,應避免新增索引,因為索引會降低更新操作的速度並佔用額外的空間。
2)基數較大的列很適合用來作索引
3)考慮管理上的開銷,應避免在索引中使用多餘5個列
4)對於多列索引,將查詢中引用最多的列放在定義的前面
5)避免新增與已有索引相似的索引
6)如果表是隻讀的,並且包含很多行,那麼可以嘗試定義一個索引,通過CREATE INDEX中的INCLUDE字句使用該索引包含查詢中引用的所有列
7)對於聯機事務處理(OLTP)環境,建立一個或者兩個索引;對於只讀查詢環境,可以建立5個以上索引;對於混合查詢和OLTP環境,可以建立2到5個環境
8)避免在建有索引的列上使用函式
9)在哪些需要排序的列上建立索引
6.影響索引的相關配置
6.1 引數配置
6.1.1 util_heap_sz 配置引數
該引數為大型實用程式堆,在同步更新階段,大型實用程式堆將提高建立或重組索引的速度。
6.1.2 sheapthres 配置引數
每個子代理程式將獲取sortheap配置引數所指定的記憶體量,以便在掃描表時避免記憶體溢位。
6.2 為索引指定不同的表空間
可將索引儲存在與資料不同的表空間,這樣,通過減少索引訪問的時間讀/寫磁頭的移動,可以更有效的使用磁碟儲存器。也可以更快的在物理裝置上建立索引表空間