理解Sybase ASE資料庫中的索引

iihero發表於2009-02-22

一、基本概念 

Sybase ASE中主要採用的B樹索引。但是出於實際應用和效能方面的考慮,它的索引又進行了細分。B樹也只是一個統稱。

從大的方向分,可以分為聚簇索引(cluster index)和非聚簇索引(non-cluster index)。 

聚簇索引:主要要求各個資料頁中資料的存放順序與鍵值的存放順序嚴格一致,而各資料頁呢,以鍵值順序連結而成即可。各級的索引頁實際上也是按照鍵值順序連結而成。基於這樣的要求,一張表最多能只能搞一個聚簇索引。

非聚簇索引:資料的存放順序與鍵值順序沒什麼關係。索引頁與資料頁之間關聯是行級別的。即索引的頁子節點中的每一項的鍵值都對應著行的鍵值,同時儲存著對應於該鍵值的行地址。從這方向看,它比聚簇索引要多一級索引訪問。回想一下,它與B-樹索引是不是有相似。

 

從鎖定方案來分,ASE中的表可以分為APL鎖表和DOL鎖表。

APL鎖表:要求鎖定索引頁的同時,對應的資料頁也一同鎖定。資料頁上的地址鏈以雙向連結串列的形式出現。

APL鎖表的聚簇索引如下圖:

                                     (圖1: APL鎖表的聚簇索引)

APL鎖表的非聚簇索引如圖2所示:

APL表的非聚簇索引示例 

                                        圖2: APL鎖表的非聚簇索引

DOL鎖表:只要求鎖定資料頁或者資料行。它只是在索引頁上有雙向連結串列。資料頁上則沒有這東東。它使用行ID來儲存實際的行地址[注:由(頁號,行號)組合行成]。 

從我個人理解來看,所謂聚簇索引,本質上就是一種B+樹(詳見資料結構)。B+樹的葉節點就要求是資料本身,並且葉節點之間相互有序連結。只不過,對於DOL鎖表的聚簇索引來講,有了一點變化,它的葉節點只是資料的鍵值,它多了一個指向實際資料行的行地址(資料頁號,行號)。加上DOL鎖表的物理儲存方式很怪異,沒有雙向連結串列。

DOL鎖表的聚簇索引示例,如圖3所示:

DOL鎖表的聚簇索引示例
 

                                          圖3: DOL鎖表的聚簇索引

 

DOL鎖表的非聚簇索引如圖4所示:

DOL鎖表的非聚簇索引

                                  圖4: DOL鎖表的非聚簇索引

 

還有一個概念,堆表:它指的就是沒有聚簇索引的表,插入資料時,就直接插入到最後一頁,直至頁滿,分配新頁,變為最後一頁這種方式。

 

二、資料更新對索引的影響

1. 插入資料

對於APL表:

     如果是聚簇索引,它將按照索引的順序去資料頁或索引頁調整各行。中間可能涉及到多次頁分裂;如果只是普通堆表,那就會在最後一頁的最後一個位置放置新行(注意,這個插入操作會鎖定該頁,多個併發操作都鎖定該頁什麼效果,很容易產生衝突,降低效率,同時只能有一個事務進行插入啊)

對於DOL表:

     因沒有位置索引,它可以把新行增加到指定的插入頁中。即先找到插入頁的頁號,然後放進去。只要資料不是位於相同的資料頁,插入效率應該還是很高的。    

2. 刪除資料:

APL表:

  資料頁或葉子頁的最後一行被刪時,該頁也會從頁鏈中刪除,並在分配頁上標為“可用”。同時,當位於頁中的行(索引行、記錄行)被刪時,位於其後的資料行就會依次上調,以確保剩餘空間總是位於該頁的最後面。總之,一次刪除操作的調整動作可能非常多。

DOL表:

     只是邏輯上的將行標識為已刪除,但實際上並沒有物理刪除(有點類似於回收站空間的味道,隨著時間往前推移,這種空間會很多,最終需要使用reorg命令來進行重整)如果空間足夠,帶有位置索引的表會將新行增加到合適的頁中,如果空間不足,只好將其放到最靠近的可用頁中。

 

三、索引的選擇:

資料的併發插入、更新、刪除,可能使用DOL鎖會好一些,引起的衝突比APL鎖要少。

可是對於查詢來講,如果是使用範圍查詢或者排序之類的查詢,聚簇索引明顯好於非聚簇索引。而APL聚簇索引比DOL聚簇索引似乎少了一次索引級訪問。

 

 

相關文章