理解Sybase ASE資料庫中的索引
一、基本概念
Sybase ASE中主要採用的B樹索引。但是出於實際應用和效能方面的考慮,它的索引又進行了細分。B樹也只是一個統稱。
從大的方向分,可以分為聚簇索引(cluster index)和非聚簇索引(non-cluster index)。
聚簇索引:主要要求各個資料頁中資料的存放順序與鍵值的存放順序嚴格一致,而各資料頁呢,以鍵值順序連結而成即可。各級的索引頁實際上也是按照鍵值順序連結而成。基於這樣的要求,一張表最多能只能搞一個聚簇索引。
非聚簇索引:資料的存放順序與鍵值順序沒什麼關係。索引頁與資料頁之間關聯是行級別的。即索引的頁子節點中的每一項的鍵值都對應著行的鍵值,同時儲存著對應於該鍵值的行地址。從這方向看,它比聚簇索引要多一級索引訪問。回想一下,它與B-樹索引是不是有相似。
從鎖定方案來分,ASE中的表可以分為APL鎖表和DOL鎖表。
APL鎖表:要求鎖定索引頁的同時,對應的資料頁也一同鎖定。資料頁上的地址鏈以雙向連結串列的形式出現。
APL鎖表的聚簇索引如下圖:
(圖1: APL鎖表的聚簇索引)
APL鎖表的非聚簇索引如圖2所示:
圖2: APL鎖表的非聚簇索引
DOL鎖表:只要求鎖定資料頁或者資料行。它只是在索引頁上有雙向連結串列。資料頁上則沒有這東東。它使用行ID來儲存實際的行地址[注:由(頁號,行號)組合行成]。
從我個人理解來看,所謂聚簇索引,本質上就是一種B+樹(詳見資料結構)。B+樹的葉節點就要求是資料本身,並且葉節點之間相互有序連結。只不過,對於DOL鎖表的聚簇索引來講,有了一點變化,它的葉節點只是資料的鍵值,它多了一個指向實際資料行的行地址(資料頁號,行號)。加上DOL鎖表的物理儲存方式很怪異,沒有雙向連結串列。
DOL鎖表的聚簇索引示例,如圖3所示:
圖3: DOL鎖表的聚簇索引
DOL鎖表的非聚簇索引如圖4所示:
圖4: DOL鎖表的非聚簇索引
還有一個概念,堆表:它指的就是沒有聚簇索引的表,插入資料時,就直接插入到最後一頁,直至頁滿,分配新頁,變為最後一頁這種方式。
二、資料更新對索引的影響
1. 插入資料
對於APL表:
如果是聚簇索引,它將按照索引的順序去資料頁或索引頁調整各行。中間可能涉及到多次頁分裂;如果只是普通堆表,那就會在最後一頁的最後一個位置放置新行(注意,這個插入操作會鎖定該頁,多個併發操作都鎖定該頁什麼效果,很容易產生衝突,降低效率,同時只能有一個事務進行插入啊)
對於DOL表:
因沒有位置索引,它可以把新行增加到指定的插入頁中。即先找到插入頁的頁號,然後放進去。只要資料不是位於相同的資料頁,插入效率應該還是很高的。
2. 刪除資料:
APL表:
資料頁或葉子頁的最後一行被刪時,該頁也會從頁鏈中刪除,並在分配頁上標為“可用”。同時,當位於頁中的行(索引行、記錄行)被刪時,位於其後的資料行就會依次上調,以確保剩餘空間總是位於該頁的最後面。總之,一次刪除操作的調整動作可能非常多。
DOL表:
只是邏輯上的將行標識為已刪除,但實際上並沒有物理刪除(有點類似於回收站空間的味道,隨著時間往前推移,這種空間會很多,最終需要使用reorg命令來進行重整)如果空間足夠,帶有位置索引的表會將新行增加到合適的頁中,如果空間不足,只好將其放到最靠近的可用頁中。
三、索引的選擇:
資料的併發插入、更新、刪除,可能使用DOL鎖會好一些,引起的衝突比APL鎖要少。
可是對於查詢來講,如果是使用範圍查詢或者排序之類的查詢,聚簇索引明顯好於非聚簇索引。而APL聚簇索引比DOL聚簇索引似乎少了一次索引級訪問。
相關文章
- Sybase ASE資料庫的license問題資料庫
- 恢復Sybase ASE 15.0.x中的master資料庫AST資料庫
- Sybase ASE資料庫恢復,Sybase資料恢復,資料誤刪除恢復工具READSYBDEVICE資料庫資料恢復dev
- 資料庫——對索引的理解資料庫索引
- 解決Sybase ASE中的dbisql (interactive sql)和Sybase SQL Anywhere中的dbisql相互打架問題SQL
- Sybase資料庫安全資料庫
- Sybase ASE安全“著陸”Linux(轉)Linux
- [貝聊科技]理解資料庫索引資料庫索引
- sybase資料庫恢復資料庫
- jive的資料庫sybase7資料庫
- SAP中的資料庫表索引資料庫索引
- MySQL(二):快速理解MySQL資料庫索引MySql資料庫索引
- sybase iq 資料庫 問題資料庫
- 找到 MySQL 資料庫中的不良索引MySql資料庫索引
- sybase ase 無法備份(backup.log中,提示with error number 109 )Error
- Sybase資料庫空間相關資料庫
- Sybase 資料庫啟停指令碼資料庫指令碼
- Sybase資料庫簡介 (轉載)資料庫
- oracle資料庫中索引空間的重用Oracle資料庫索引
- Oracle資料庫中索引的維護 ztOracle資料庫索引
- Oracle資料庫中索引的維護(zt)Oracle資料庫索引
- Oracle資料庫中索引的維護(轉)Oracle資料庫索引
- 資料庫索引中包含的資料結構有哪些資料庫索引資料結構
- 【SqlServer】 理解資料庫中的資料頁結構SQLServer資料庫
- 【資料庫】mysql資料庫索引資料庫MySql索引
- mysql資料庫的索引MySql資料庫索引
- 資料庫的部分索引資料庫索引
- 資料庫索引資料庫索引
- SYBASE資料庫dbcc命令詳解(zt)資料庫
- Oracle資料庫中索引的維護 (轉帖)Oracle資料庫索引
- 用VC訪問Sybase資料庫(用Sybase提供的ct-library介面) (轉)資料庫
- 常見資料庫SYBASE和SQL SERVER的比較資料庫SQLServer
- 資料庫廠商的發展歷史之Sybase資料庫
- sybase 的裝置和資料庫,是啥關係?資料庫
- 教小白搭建sybase資料庫環境資料庫
- 請教,JIVE如何聯接SYBASE資料庫?資料庫
- 使用oracle Transparent gateway 連線 sybase 資料庫OracleGateway資料庫
- Sybase或SQLServer資料庫分批歸檔方案SQLServer資料庫