標籤:
5.oracle的dump理解五 資料區塊理論
歡迎轉載,轉載請標明出處:http://blog.csdn.net/notbaron/article/details/51228514
前兩篇描述了我們在操作層面看到的一些東西,但是沒有理論指導,看到越多我們只會越迷糊。所以,蛤蟆從官方文檔上摘取一些老少皆宜的內容來補腦。
塊是資料區塊IO的最小單位。
1 資料區塊和作業系統塊
從物理層面,資料庫的Block Storage時候是由作業系統塊組成。作業系統塊是作業系統可以讀寫的最小資料單位。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選項。
5.oracle的dump理解五 資料區塊理論