共計 2513 個字符,預計需要花費 7 分鐘才能閱讀完成。
本篇文章給大家分享的是有關如何理解 oracle 索引組織表,丸趣 TV 小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著丸趣 TV 小編一起來看看吧。
今天學習下 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 索引組織表,丸趣 TV 小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注丸趣 TV 行業資訊頻道。