您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關如何理解oracle索引組織表,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
今天學習下oracle中索引組織表,通過這篇文章,你可了解到,什么是索引組織表?什么情況下可以使用索引組織?索引組織表的優點?索引組織表的弊端?
一:什么時候索引組織表(IOT)
索引組織表(index organized table): 索引組織表以B*樹結構存儲,我們知道oracle默認的表是是堆表,堆表是以一種無組織的方式存儲的(只要有可用的空間,就可以放數據),而IOT與之不同,IOT中的數據按著主鍵的順序存儲和排序的,對于應用來說,IOT表現得和常規的堆表并無區別,需要只用sql來正確的來訪問IOT,簡單的概述起來:索引組織表----》索引就是數據,數據就是索引,因為數據就是按著B*樹結構存儲的。如下圖是一個典型的B*tree索引的結構(針對oracle b*tree索引的理解請參考我的另一篇文章http://blog.itpub.net/29654823/viewspace-2150192/)。
而我們今天探討的索引組織表也是按著這個結構存儲數據的,它與B*tree索引的區別是:B*tree索引葉子節點存儲是索引鍵值+rowid;而索引組織表的葉子節點存儲的是整行數據,這很類似于mysql的innodb引擎的表。需要注意的是IOT對于主鍵的設置格外嚴格,要求創建表的時候就必須指定明確的主鍵列,因為IOT中的數據是按著主鍵的順序存儲和排序的
二;索引組織表的優點
1)首先顯而易見的是索引組織表是可以節約空間的,因為索引和表合二為一,
2)還有就是根據主鍵進行唯一掃描或者范圍掃描的時候由于索引的排列順序這些列是按索引排列好的,而且比一般索引少一次ROWID回表的操作,那么速度會更快,
3)其次如果根據數據特點比如一個身份證號ID,一個銀行卡號,顯然一個身份證號ID可以有多個銀行卡號,如果我們建立索引組織表結構為(身份證號ID和銀行卡號),顯然如果在查詢的時候使用ID=** 那么這種情況下,索引組織表的優勢就出來了,首先他少一次ROWID回表操作,其次索引組織表的排列是有序的,那么同一個身份證的ID的的卡號信息一定存儲在臨近的塊中,這實際也是第二點的一個列子。
4)在堆組織表中,兩行數據在同一個數據庫塊上的可能性幾乎為0,而iot表根據主鍵排序后的順序進行排列,所以在按著時間范圍或者按著主鍵范圍查詢的數據在同一個塊上或者相鄰的塊上,所以查詢出來這些數據需要的邏輯io 和物理io都會減少。
5)提高緩沖區緩存效率,因為給定查詢在緩存中需要的塊更少,·減少緩沖區緩存訪問,這會改善可擴縮性。
三:索引組織表的弊端以及適用場景:
索引組織表(IOT)不僅可以存儲數據,還可以存儲為表建立的索引。索引組織表的數據是根據主鍵排序后的順序進行排列的,這樣就提高了訪問的速度。但是由于每次寫入和更新后都要重新進行重新排序,導致插入和更新性能降低,所以個人認為在oltp系統中,不太適合使用IOT表,
IOT對信息獲取、空間系統和OLAP應用最為有用,如果經常在一個主鍵或唯一鍵上使用between查詢,如果數據有序地物理存儲,就能提升這些查詢的性能,
四:說下oracle索引組織表的溢出段(overflow段)
1)overflow段存在的意義
為了讓索引葉子塊(包含具體索引數據的塊)能夠高效地存儲數據,索引一般在一個列子集上,通常索引塊上的行數比堆表塊上的行數多出幾倍。索引指望著每塊能得到多行,否則,oracle會花費大量的時間來維護索引,因為每個insert或update都可能導致索引塊分解。
創建IOT時,overflow子句允許你建立另一個段(就相當于讓IOT成為了一個多段對象,就像有一個CLOB列一樣)如果IOT的行數據變得太大,就可以溢出到這個段中。讀取數據的時候,oracle將讀取行的"首部",找到行余下部分的指針,然后讀取這些部分。
再就是因為所有數據都放入索引,所以當表的數據量很大時,會降低索引組織表的查詢性能。此時設置溢出段將主鍵和溢出數據分開來存儲以提高效率。注意長期都是SELECT * FROM 那么溢出段也就沒有用處;
2)overflow段實現的方式;PCTTHRESHOLD和INCLUDING 兩種
PCTTHRESHOLD n :制定一個數據塊的百分比,當行中的數據量超過塊的這個百分比的時候,行中余下的列將存儲在溢出段,例如PCTTHRESHOLD是10%,而塊的大小是8kb,所以長度大于800字節的行就會把其中一部分列值存儲在別處,而不能在索引塊上存儲。
INCLUDING column_name :行中從第一列直到INCLUDING字句所指定列(包括這個列在內)都放入索引塊,之后的列都放到溢出段
3)關于overflow段實現的方式的選擇標準
1.如果你的應用中總是(或者幾乎總是)使用表的前4列,而很少訪問后5列,使用INCLUDING會更合適;
2.如果無法清除的指出哪些列總被訪問而哪些列一般不會被訪問,就可以考慮使用PCTTHRESHOLD。一旦確定了平均每個索引塊上可能存儲多少行,設置PCTTHRESHOLD就會很容易;例如你希望每個索引塊上存儲20行,那好,這說明每行應該是1/20(5%),你的PCTTHRESHOLD 就是5,這樣每行數據占用塊的大小最多是塊的5%,就能保證可以存20行數據了;
針對oracle索引組織表,數據倉庫等olap系統中可以使用,不太適合oltp系統,并且索引組織表上還可以創建索引,稱之為二次索引,并且二次索引和常規表的索引相比效率燒低,因為IOT,通常需要兩個掃描,一次掃描二次索引結構,另一次掃描IOT本身。然后關于索引組織表的溢出段可以使用ALTER TABLE ... OVERFLOW語句來更改溢出段的屬性 。
以上就是如何理解oracle索引組織表,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。