You are on page 1of 2

Chapter

9 Index

表格為唯讀或不常被異動

點陣圖索引的缺點就是當表格異動時,點陣圖索引的維護成本相當的高,遠大於平衡樹索引。因為當維護
某個索引項目前,該索引項目必須先被鎖定,而該索引項目所關連的資料列也將被鎖定。但是點陣圖索引
的每個索引項目所對應到多筆資料列,不像平衡樹索引一樣,一個索引項目對應到一筆資料列。因此每次
維護點陣圖索引時,將導致表格的多筆資料列將被鎖定,影響資料表的同時性(Concurrency)。為此
Oracle 伺服器已經將每個 DML 操作所產生的點陣圖索引維護操作,遞延到 DML 操作完成後,才一起維
護點陣圖索引,而不是每筆資料列的異動就維護索引一次。但是維護點陣圖索引的成本,還是較平衡樹索
引來得高。所以當表格常被異動,造成索引項目常需要維護的情況下,並不適合建立點陣圖索引,如果一
定要建立索引,建議使用平衡樹索引。

--建立一個範例表格t1,由id與type兩個欄位組成共有5筆資料列。
SQL> CREATE TABLE frank.t1(seq NUMBER,id NUMBER,type VARCHAR2(30));
SQL> INSERT INTO frank.t1 VALUES(1,1,'Type A');
SQL> INSERT INTO frank.t1 VALUES(2,2,'Type B');
SQL> INSERT INTO frank.t1 VALUES(3,3,'Type C');
SQL> INSERT INTO frank.t1 VALUES(4,4,'Type A');
SQL> INSERT INTO frank.t1 VALUES(5,5,'Type B');
SQL> INSERT INTO frank.t1 VALUES(6,6,'Type C');
SQL> INSERT INTO frank.t1 VALUES(7,7,'Type A');
SQL> INSERT INTO frank.t1 VALUES(8,8,'Type B');
SQL> COMMIT;
SQL> SELECT * FROM frank.t1;

SEQ ID TYPE
---------- -------------- ------------------------------
1 1 Type A
2 2 Type B
3 3 Type C
4 4 Type A
5 5 Type B
6 6 Type C
7 7 Type A
8 8 Type B

SQL> CREATE INDEX frank.t1_id_idx ON frank.t1(id); --建立一個平衡樹索引


SQL> CREATE BITMAP INDEX frank.t1_type_idx ON frank.t1(type); --建立一個點陣圖索引
SQL> EXECUTE dbms_stats.gather_table_stats('FRANK','T1'); --分析表格及索引取得統計資料

Oracle Database 11g 資料庫管理入門


Chapter 9 Index

階段作業 A 階段作業 B
SQL> UPDATE frank.t1 SET id=11 SQL> UPDATE frank.t1 SET id=88
2 WHERE seq=1; 2 WHERE seq=8;
1 row updated. 1 row updated.
--立刻完成異動 --立刻完成異動

因為ID欄位上的索引為平衡樹索引,因此即便是索引項目需要維護,也只影響一筆資料列。所以階段作業A與
階段作業B只要不是異動表格t1的同一筆資料列,便可以同時異動表格t1的不同資料列的ID欄位值。

SQL> COMMIT; SQL> COMMIT;

Commit complete. Commit complete.

SQL> UPDATE frank.t1 SET type=’Type C’


2 WHERE seq=2;

1 row updated.

SQL> UPDATE frank.t1 SET type=’Type A'


2 WHERE seq=5;

--此時並沒有如同之前的異動,立刻出現異動完成
的訊息。反而進入擱置狀態
因為TYPE欄位上的索引為點陣圖索引,而且階段作業A異動的資料列(seq=2)原本的TYPE欄位值為’Type B’
,當要將其更改為’Type C’時,需要鎖定兩個索引項目分別為索引鍵值為’Type B’與’Type C’。這時階段作業
B也接著想要修改的資料列(seq=5)的TYPE欄位值,將其改為’Type A’,但因為這個欄位值原本為’Type B’,
所以階段作業B也需要取得索引項目的索引鍵值為’Type B’與’Type A’的鎖定。但是索引鍵值為’Type B’的索
引項目已經被階段作業A所取得,因此階段作業B必須等待階段作業A釋放該鎖定,才能進行異動。

Oracle Database 11g 資料庫管理入門

You might also like