1. 程式人生 > >【DB2】索引

【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

但是上述兩種不能同時存在

否則報錯如下:

image


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 為索引指定不同的表空間

可將索引儲存在與資料不同的表空間,這樣,通過減少索引訪問的時間讀/寫磁頭的移動,可以更有效的使用磁碟儲存器。也可以更快的在物理裝置上建立索引表空間