【DB筆試面試558】在Oracle中,反向鍵索引(Reverse Key Indexes)是什麼?
- 2019 年 10 月 10 日
- 筆記
♣
題目部分
在Oracle中,反向鍵索引(Reverse Key Indexes)是什麼?
♣
答案部分
反向鍵索引也稱為反轉索引,是一種B-Tree索引,它在物理上反轉每個索引鍵的位元組,但保持列順序不變。例如,如果索引鍵是20,並且在一個標準的B-Tree索引中此鍵被存為十六進制的兩個位元組C1,15,那麼反向鍵索引會將其存為15,C1。
SYS@orclasm > SELECT DUMP(20,'16') FROM DUAL; DUMP(20,'16') ------------------ Typ=2 Len=2: c1,15
反向鍵索引解決了在B-Tree索引右側的的葉塊爭用問題。在Oracle RAC數據庫中的多個實例重複不斷地修改同一數據塊時,這個問題尤為嚴重。在一個反向鍵索引中,對位元組順序反轉,會將插入分散到索引中的所有葉塊。例如鍵20和21,本來在一個標準鍵索引中會相鄰,現在存儲在相隔很遠的獨立的塊中。這樣,順序插入產生的I/O被更均勻地分佈了。
使用反向鍵索引的最大的優點莫過於降低索引葉子塊的爭用,減少熱點塊,提高系統性能。由於反向鍵索引自身的特點,如果系統中經常使用範圍掃描進行讀取數據的話(例如在WHERE子句中使用「BETWEEN AND」語句或比較運算符「>」、「<」、「>=」、「<=」等),那麼反向鍵索引將不會被使用,因為此時會選擇全表掃描,反而會降低系統的性能。只有對反向鍵索引列進行「=」操作時,其反向鍵索引才會使用。
反向鍵索引應用場合:
① 在索引葉塊成為熱點塊時使用
通常,使用數據時(常見於批量插入操作)都比較集中在一個連續的數據範圍內,那麼在使用正常的索引時就很容易發生索引葉子塊過熱的現象,嚴重時將會導致系統性能下降。
② 在RAC環境中使用
當RAC環境中幾個節點訪問數據的特點是集中和密集,索引熱點塊發生的幾率就會很高。如果系統對範圍檢索要求不是很高的情況下可以考慮使用反向鍵索引技術來提高系統的性能。因此該技術多見於RAC環境,它可以顯著的降低索引塊的爭用。
③ 反向鍵索引通常建立在值是連續增長的列上,使數據均勻地分佈在整個索引上。
使用如下的SQL語句可以查詢到所有的反向鍵索引:
SELECT * FROM DBA_INDEXES D WHERE D.INDEX_TYPE LIKE '%/REV'; --創建索引時使用REVERSE關鍵字,如下所示: CREATE INDEX REV_INDEX_LHR ON XT_REVI_LHR(OBJECT_ID) REVERSE; ALTER INDEX REV_INDEX REBUID NOREVERSE; ALTER INDEX NAME_INX REBUILD ONLINE NOREVERSE; ALTER INDEX ID_INX REBUILD REVERSE ONLINE; ALTER INDEX ID_INX REBUILD ONLINE REVERSE;
本文選自《Oracle程序員面試筆試寶典》,作者:李華榮。