5 oracle的dump理解五 資料塊理論
5.oracle的dump理解五 資料塊理論
歡迎轉載,轉載請標明出處:http://blog.csdn.net/notbaron/article/details/51228514
前兩篇描述了我們在操作層面看到的一些東西,但是沒有理論指導,看到越多我們只會越迷糊。所以,蛤蟆從官方文件上摘取一些老少皆宜的內容來補腦。
塊是資料塊IO的最小單位。
1 資料塊和作業系統塊
從物理層面,資料庫的塊儲存時候是由作業系統塊組成。作業系統塊是作業系統可以讀寫的最小資料單位。ORACLE塊是一個邏輯儲存結構結構,大小和結構對作業系統是透明的。
如下圖1:
資料塊大小和作業系統塊大小是可以不一樣的,資料塊請求多個數據塊,不是多個作業系統塊。
當資料庫請求一個數據塊,作業系統轉換這個請求操作到儲存上。資料塊的邏輯分離有一下兩點:
n 應用層面不需要確定磁碟上資料的實體地址
n 資料塊可以條帶或映象到多個物理磁碟
1.1 資料塊大小
每個資料塊都有一個數據塊塊大小。有初始化引數DB_BLOCK_SIZE初始化引數在建立庫的時候設定。如果沒有設定就使用作業系統預設的塊大小來制定。標準的資料塊大小是4KB或8KB。如果和作業系統塊大小不一樣,必須是作業系統的倍數。
1.2 表空間塊大小
在建立獨立的表空間的時候使用不同於DB_BLOCK_SIZE大小的塊大小。
2 塊格式
每個資料塊都有一個格式或內部結構來使能資料塊來跟蹤資料和空閒空間。存放表,索引還是表族資料都是相似的。
如下圖2:
2.1 資料塊Overhead
資料塊的Overhead蛤蟆不知道翻譯成什麼,就不翻譯了。
資料塊使用Overhead來管理塊本身。不能用於儲存使用者資料。這就說明雖然每個塊大小假設是8KB,但是實際可用的其實並沒有這麼多的。
Overhead包含如下幾個部分:
2.1.1 塊頭
塊頭包含塊的通用資訊,例如塊地址,段型別。對於交易管理的塊,塊頭包含了活動和歷史的交易資訊。
每個更新塊都需要一個交易入口(transaction entry)。ORACLE資料塊初始化保留了這些空間。每個交易入口需要的空間取決於作業系統平臺。一般是23個位元組左右。
2.1.2 表目錄
對於堆表,這個目錄包含存在這個塊的表的元資料塊。對於簇表,多個表會儲存行在同一個塊中。
2.1.3 行目錄
對於堆表,該目錄描述行在塊中的位置。資料塊會把行放到塊底部的任何位置。行地址記錄在該目錄向量中。
一個rowid指向特定檔案,塊和行位置。例如ROWID:AAAPecAAFAAAABSAAA最後3個AAA表示行號.行號是行目錄中索引。行目錄包含指向塊中資料的指標。如果從塊中移動一行,資料塊會修改行目錄中的指標,ROWID保持不變。
資料庫在行目錄分配空間後,刪除行後資料塊不會回收這個空間。因此,一個當前是空的塊(曾有50行的塊)可能分配了100個位元組在行目錄。資料塊在插入行的時候會重新使用這空間。
OverHead中的有些部分是固定的,但是整體是變化的。平均在84~107位元組。
2.2 行格式
一個塊中除了Overhead,剩下的都是行了。就是真正放資料的地方了。
行資料保持真正的資料,例如錶行或索引鍵。每個資料塊有內部格式,每個行也有行格式使得資料塊來跟蹤資料。
Oracle資料塊通過變長記錄來儲存行。一個行包含一個或多個段。每個段叫做行片(rowpiece),每個行片有一個行頭和列資料。
如下圖3:
2.2.1 行頭
ORACLE資料使用行頭來管理行片在塊中的儲存。行頭包含以下資訊:
l 行片中的列數量
l 在其他塊中的行片(如果完整的行在一個數據塊中,那麼行作為一個行片,如果不能在一個塊中儲存,那麼會被儲存在多個行片中)
l 簇表的簇鍵
一個塊中完整包含一個行至少需要3個位元組的行頭。
2.2.2 列資料
行頭之後,列資料段儲存實際的資料。一般,儲存列的順序和CREATE TABLE語句一致,但是順序不能保證。例如,LONG型別一般最後建立。
在行片中的每個列,資料庫分開儲存列長度和資料。空間取決於資料型別。如果是可變的,那麼會需要空間來增長或變小。
在塊頭中的行目錄上的有個槽指向行。
2.2.3 ROWID格式化
ORACLE使用ROWID來唯一指定一行。ROWID是資料塊用來訪問行的結構。一個ROWID物理上不存在資料塊上,但是和資料所在的檔案和塊相關。
ROWIW格式如下圖4:
分為4個段,第一個是資料物件號,表簇有相同的資料物件號。
第二個是相對檔案號,第三個是塊號,第四個是行號。
ROWID指向一個行片後,ROWID在一些情況下可以改變。例如,發生行移動,分割槽鍵更新,閃回表操作等。
內部資料塊執行行移動是物理上先刪除然後在插入。但是行移動是被當做UPDATE,可能會觸發觸發器。
3 塊壓縮
資料塊可以使用表壓縮來消除資料塊中重複值。
資料塊的格式不管是否壓縮都是一樣的。區別在於,塊開始儲存時候儲存了一個符號表。使用符號表中的短符號來代替重複的值。
例如:
2190,13770,25-NOV-00,S,9999,23,161
2225,15720,28-NOV-00,S,9999,25,1450
34005,120760,29-NOV-00,P,9999,44,2376
9425,4750,29-NOV-00,I,9999,11,979
1675,46750,29-NOV-00,S,9999,19,1121
壓縮後如下:
2190,13770,25-NOV-00,S,%,23,161
2225,15720,28-NOV-00,S,%,25,1450
34005,120760,*,P,%,44,2376
9425,4750,*,I,%,11,979
1675,46750,*,S,%,19,1121
使用*來替換29-NOV-00
使用%來替換9999
符號表如下圖5:
4 資料塊中的空間管理
資料塊填充資料塊從底部開始,空閒空間位於行資料和塊頭之間。在UPDATE時候自由空間會減少。資料庫管理空閒空間來優化效能避免浪費空間。
4.1 空閒空間百分比
PCTFREE引數指定如何管理自由空間。PCTFREE是重要的避免行遷移和空間浪費。
如果更新少,可以如下設定:
CREATETABLE test_table (n NUMBER) PCTFREE 20;
如下圖6所示
PCTFREE設定為20,需要至少有20%的塊是空閒的。預留20%是用於現存行更新的使用。
4.2 資料塊中優化空閒空間
空間空間的比例不能少於PCTFREE,但是可以超過20%的。
以下命令可以增加塊中的空閒空間:
l DELETE
l UPDATE(將存在的值改成更小的值,或者讓行發生遷移)
l INSERT(插入喚醒塊壓縮,導致更多空閒空間)
insert釋放空間注意下面2點:
1、 本次交易的插入語句釋放後,還是本次交易使用該空間;
2、 如果是其他交易釋放的空間,需要其他交易COMMIT後才能使用
4.3 合併碎片空間
釋放的空間可能不是連續的,如下圖7所示
當一下條件發生時候,ORACLE自動合併空閒空間
l INSERT或UPDATE命令企圖使用塊中空間來包含新行
l 空閒空間太分散不能插入到塊中連續的空間中
合併後,空閒空間就連續了。
合併只有在條件滿足才執行,因為會該動作是會影響效能的。
4.4 行連線和行遷移
資料塊必須管理太大的行儲存在單個塊中。
l 當第一次插入時候,行太大。ORACLE儲存該行使用段保留的多個塊連線。行連線在大行時候經常發生。例如包含LONG或者LONGRAW。不可避免的。
l 當行被更新的長度增加,剩下的空間不能保持更新的行。發生行遷移,將整行移動新的資料塊,原來行片中儲存一個指標指向新的位置。ROWID並沒有發生改變。
l 一行超過255列,一個行片中只能保持255個列。如果超過的話,需要連結多個塊了。
當行遷移或連結後,IO就會增加。
5 索引塊
索引塊是特殊型別的塊,和表塊有些不同。資料塊使用索引塊來管理索引的邏輯儲存空間。
索引塊型別有如下:
根塊:索引入口
分支塊:搜尋索引鍵時候的導航塊
葉塊:包含索引鍵值ROWID,指向表中的相關行。
5.1 索引入口儲存
索引入口儲存方式和錶行在資料塊中儲存一樣。索引在塊中的不是按二進位制順序儲存,而是用堆的方式。
資料塊管理行目錄的方式和資料塊有些不同。行目錄中的是根據鍵值排序的。提高了索引掃描的效率。
5.2 索引塊槽位複用
索引塊比堆表的表塊有更多行。在一個單獨索引塊中儲存很多行,可以讓資料塊管理更簡單因為可以避免頻繁的分裂塊。
資料塊可以複用索引塊中的空間。如果插入一個值到列中,然後刪除一個值。當行需要空間的會後,資料塊會重新使用之前刪掉釋放出來的索引槽位。
索引不能合併他們自己,除非手動執行ALTER INDEX REBUILD或者COALESCE選項。
5.3 合併索引塊
索引合併壓實當前存在索引資料,如果重新組織釋放了塊,釋放的塊留在索引結構中,並不釋放出來給其他使用者。不會自動執行,需要輸入ALTER INDEX REBUILD或者COALESCE選項。
再分享一下我老師大神的人工智慧教程吧。零基礎!通俗易懂!風趣幽默!希望你也加入到我們人工智慧的隊伍中來!http://www.captainbed.net