Oracle 數據塊體系基礎知識概述
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
<span style="background-color:inherit;line-height:1.5;">Oracle 數據塊體系基礎知識概述 </span>
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
數據塊概述
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
Oracle對數據庫數據文件(datafile)中的存儲空間進行管理的單位是數據塊(data block)。數據塊是數據庫中最小的(邏輯)數據單位。與數據塊對應的,所有數據在操作系統級的最小物理存儲單位是字節(byte)。每種操作系統都有一個被稱為塊容量(block size)的參數。Oracle每次獲取數據時,總是訪問整個數(Oracle)數據塊,而不是按照操作系統塊的容量訪問數據。
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
數據庫中標準的數據塊(data block)容量是由初始化參數 DB_BLOCK_SIZE 指定的。除此之外,用戶還可以指定五個非標準的數據塊容量(nonstandard block size)。數據塊容量應該設為操作系統塊容量的整數倍(同時小于數據塊容量的最大限制),以便減少不必要的I/O操作。Oracle數據塊是Oracle可以使用和分配的最小存儲單位。
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
<br style="background-color:inherit;" />
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
<b style="background-color:inherit;">2.2.1 數據塊結構</b>
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
在Oracle中,不論數據塊中存儲的是表(table)、索引(index)或簇表(clustered data),其內部結構都是類似的。
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
圖2-1 數據塊結構
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
<img data-media-type="image" src="file://D:/%E6%9C%89%E9%81%93%E4%BA%91%E7%AC%94%E8%AE%B0/%E6%95%B0%E6%8D%AE%E7%9B%AE%E5%BD%95/zr2095@163.com/538ff9530dd94f08a6bce97686e5c92b/data%20block%20format.gif" data-attr-org-src-id="1B1D614EDE1F4AF3B819DD86BDE3B225" data-attr-org-img-file="file:///D:/%E6%9C%89%E9%81%93%E4%BA%91%E7%AC%94%E8%AE%B0/%E6%95%B0%E6%8D%AE%E7%9B%AE%E5%BD%95/zr2095@163.com/538ff9530dd94f08a6bce97686e5c92b/data%20block%20format.gif" style="cursor:default;display:inline-block;margin-top:8px;max-width:800px;font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;" /><img src="/attachment/201510/6/30208428_14441421802cbM.gif" width="372" height="320" alt="" /><br />
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
<br style="background-color:inherit;" />
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
<img data-media-type="image" src="file://D:/%E6%9C%89%E9%81%93%E4%BA%91%E7%AC%94%E8%AE%B0/%E6%95%B0%E6%8D%AE%E7%9B%AE%E5%BD%95/zr2095@163.com/538ff9530dd94f08a6bce97686e5c92b/data%20block%20format.gif" data-attr-org-src-id="1B1D614EDE1F4AF3B819DD86BDE3B225" data-attr-org-img-file="file:///D:/%E6%9C%89%E9%81%93%E4%BA%91%E7%AC%94%E8%AE%B0/%E6%95%B0%E6%8D%AE%E7%9B%AE%E5%BD%95/zr2095@163.com/538ff9530dd94f08a6bce97686e5c92b/data%20block%20format.gif" style="background-color:inherit;cursor:default;display:inline-block;margin-top:8px;max-width:800px;" />
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
本圖顯示了數據塊的各個組成部分,包括:數據塊頭(包括標準內容和可變內容)(common and variable header),表目錄區(table directory),行目錄區(row directory),可用空間區(free space),行數據區(row data)。以下各節將分別講解各個組成部分。圖中兩個箭頭表示一個數據塊中的可用空間區的容量是可變的。
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
<p style="color:#222222;font-family:Tahoma, sans-serif;font-size:small;">
<br />
</p>
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
<b style="background-color:inherit;">2.2.1.1 數據塊頭(包括標準內容和可變內容)</b>
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
數據塊頭(header)中包含了此數據塊的概要信息,包括塊地址(block disk address)及此數據塊所屬的段(segment)的類型(例如,表或索引)。
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
<ul style="margin-top:0px;margin-bottom:0px;background-color:inherit;">
<li style="font-size:small;font-family:Tahoma, sans-serif;color:#222222;">
<p style="background-color:inherit;">
Block header
</p>
<p style="background-color:inherit;">
This part contains general information about the block, including disk address and segment type. For blocks that are transaction-managed, the <span style="line-height:1.5;">block header</span><span style="line-height:1.5;"> </span><span style="line-height:1.5;">contains active and historical transaction information.</span>
</p>
<p style="background-color:inherit;">
<span style="line-height:1.5;">A </span><span style="line-height:1.5;">transaction entry</span><span style="line-height:1.5;"> is required for every transaction that updates the block. Oracle Database initially reserves space in the block header for transaction entries. In data blocks allocated to segments that support transactional changes, free space can also hold transaction entries when the header space is depleted. The space required for transaction entries is operating system dependent. However, transaction entries in most operating s</span><span style="line-height:1.5;">ystems require approximately 23 bytes.</span>
</p>
<p style="background-color:inherit;">
<span style="line-height:1.5;">數據塊頭</span>
</p>
<p style="background-color:inherit;">
<span style="line-height:1.5;">這部分包含了關于數據塊的塊地址(在磁盤上的地址)和段類型一般信息。對于那些事務型數據塊,它們的塊頭還包含了當前和歷史事務信息。</span>
</p>
<p style="background-color:inherit;">
<span style="line-height:1.5;">一個事務記錄被每一個更新數據塊的事務所需求。oracle數據塊初始時在數據塊頭中為事務記錄保留了空間。在分配給支持事務變化的段的數據塊時,當塊頭空間耗盡時,空閑空間也能保留事務記錄。事務記錄所需要的空間是操作系統依賴的。然而,在大多數操作系統中事務記錄大約需要23bytes空間。</span>
</p>
</li>
</ul>
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
<p style="color:#222222;font-family:Tahoma, sans-serif;font-size:small;line-height:1.5;">
<br />
</p>
<br style="background-color:inherit;" />
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
<b style="background-color:inherit;">2.2.1.2 表目錄區</b>
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
如果一個數據表在此數據塊中儲存了數據行,那么數據表的信息將被記錄在數據塊的表目錄區(table directory)中。
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
<ul style="margin-top:0px;margin-bottom:0px;font-family:Tahoma, sans-serif;font-size:small;">
<li style="background-color:inherit;">
<p style="color:#222222;background-color:inherit;">
Table directory
</p>
<p style="background-color:inherit;">
<span style="background-color:inherit;color:#222222;">For a </span><span style="background-color:inherit;color:#000000;">heap-organized table</span><span style="background-color:inherit;color:#222222;">, this directory contains metadata about tables whose rows are stored in this block. Multiple tables can store rows in the same block.</span>
</p>
<p style="color:#222222;background-color:inherit;">
表目錄
</p>
<p style="color:#222222;background-color:inherit;">
對于堆表來說,這個目錄包含了存儲在這個塊中的表的元數據,多個表能夠在相同的數據塊中存儲行。
</p>
</li>
</ul>
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
<br style="background-color:inherit;" />
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
<b style="background-color:inherit;">2.2.1.3 行目錄區</b>
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
此區域包含數據塊中存儲的數據行的信息(每個數據行片斷(row piece) 在行數據區(row data area)中的地址)。[一個數據塊中可能保存一個完整的數據行,也可能只保存數據行的一部分 ,所以文中使用row piece
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
<br style="background-color:inherit;" />
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
當一個數據塊(data block)的行目錄區(row directory)空間被使用后,即使數據行被刪除(delete),行目錄區空間也不會被回收。舉例來說,當一個曾經包含50條記錄的數據塊被清空后,其塊頭(header)的行目錄區仍然占用100字節(byte)的空間。只有在數據塊中插入(insert)新數據時,行目錄區空間才會被 重新利用。
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
<br style="background-color:inherit;" />
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
<ul style="margin-top:0px;margin-bottom:0px;color:#222222;font-family:Tahoma, sans-serif;font-size:small;">
<li style="background-color:inherit;">
<p style="background-color:inherit;">
Row directory
</p>
<p style="background-color:inherit;">
For a heap-organized table, this directory describes the location of rows in the data portion of the block.
</p>
<p style="background-color:inherit;">
After space has been allocated in the row directory, the database does not reclaim this space after row deletion. Thus, a block that is currently empty but formerly had up to 50 rows continues to have 100 bytes allocated for the row directory. The database reuses this space only when new rows are inserted in the block.
</p>
<p style="background-color:inherit;">
行目錄
</p>
<p style="background-color:inherit;">
對于一個堆表來說,這個目錄描述了行在數據塊中 的位置。
</p>
<p style="background-color:inherit;">
在行目錄中,空間被分配之后,數據庫不會在行刪除之后重新聲明這個空間。另外,一個數據塊當前是空的,但是之前已經到達了50行記錄,會持續保持已分配的100bytes空間。數據庫只有當新的行插入時才會使用這個空間。(HWM)
</p>
</li>
</ul>
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
<br style="background-color:inherit;" />
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
<b style="background-color:inherit;">2.2.1.4 管理開銷</b>
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
數據塊頭(data block header),表目錄區(table directory),行目錄區(row directory)被統稱為管理開銷(overhead)。其中 有些開銷的容量是固定的;而有些開銷的總容量是可變的。數據塊中固定及可變管理開銷的容量平均在84到107字節(byte)之間。
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
<br style="background-color:inherit;" />
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
<span style="color:#222222;font-family:Tahoma, sans-serif;font-size:small;">Oracle Database uses the </span><span style="font-family:Tahoma, sans-serif;font-size:small;background-color:inherit;">block overhead</span><span style="color:#222222;font-family:Tahoma, sans-serif;font-size:small;"> to manage the block itself. The block overhead is not available to store user data.<span style="background-color:inherit;"> </span></span><br style="background-color:inherit;" />
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
<span style="color:#222222;font-family:Tahoma, sans-serif;font-size:small;"><span style="background-color:inherit;">oracle數據庫使用塊管理開銷來管理本身。管理開銷不能用來存儲用戶數據。</span></span>
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
<span style="color:#222222;font-family:Tahoma, sans-serif;font-size:small;"><span style="background-color:inherit;"><br style="background-color:inherit;" />
</span></span>
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
<span style="color:#222222;font-family:Tahoma, sans-serif;font-size:small;"><span style="background-color:inherit;">
<div style="color:#000000;font-family:微軟雅黑;font-size:14px;">
<p style="color:#222222;font-family:Tahoma, sans-serif;font-size:small;">
Some parts of the block overhead are fixed in size, but the total size is variable. On average, the block overhead totals 84 to 107 bytes.
</p>
<p style="color:#222222;font-family:Tahoma, sans-serif;font-size:small;">
部分數據塊開銷是固定的,但是總大小是可變的。一般來說,數據塊開銷一般為84-107bytes。
</p>
</div>
<br style="background-color:inherit;" />
</span></span>
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
<b style="background-color:inherit;">2.2.1.5 行</b>
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
數據塊(data block)中行數據區(row data)包含了表或索引的實際數據。一個數據行可以跨多個數據塊。這就出現了“行鏈接(Row Chaining)及行遷移(Row Migrating)<span style="background-color:inherit;line-height:1.5;"> </span>
</div>
<h5 style="font-size:14px;line-height:21px;white-space:normal;widows:auto;color:#222222;font-family:Tahoma, sans-serif;background-color:#FFFFFF;">
Row Format
</h5>
<p style="white-space:normal;widows:auto;color:#222222;font-family:Tahoma, sans-serif;font-size:small;background-color:#FFFFFF;">
The row data part of the block contains the actual data, such as table rows or index key entries. Just as every data block has an internal format, every row has a <span style="background-color:inherit;font-weight:bold;">row format</span> that enables the database to track the data in the row.
</p>
<p style="white-space:normal;widows:auto;color:#222222;font-family:Tahoma, sans-serif;font-size:small;background-color:#FFFFFF;">
Oracle Database stores rows as variable-length records. A row is contained in one or more <span style="background-color:inherit;font-weight:bold;">row pieces</span>. Each row piece has a <span style="background-color:inherit;font-weight:bold;">row header</span> and <span style="background-color:inherit;font-weight:bold;">column data</span>.
</p>
<p style="white-space:normal;widows:auto;color:#222222;font-family:Tahoma, sans-serif;font-size:small;background-color:#FFFFFF;">
<span style="color:#666666;font-family:宋體, Arial;font-size:12px;">塊的行數據部分包含了真實的數據,例如表行或者索引記錄。正如每個數據塊有一個內部格式一樣,每個行也有行格式,使得數據庫能夠追蹤到行里的數據(row是由一個或多個piece組成的)。</span>
</p>
<p style="white-space:normal;widows:auto;color:#222222;font-family:Tahoma, sans-serif;font-size:small;background-color:#FFFFFF;">
<a href="file://C:/Users/ZhuRui/AppData/Local/Youdao/YNote/editor/web/editor.html#i20134" style="background-color:inherit;cursor:pointer;color:#72007C;">Figure 12-7</a> shows the format of a row.
</p>
<div style="white-space:normal;widows:auto;color:#222222;font-family:Tahoma, sans-serif;font-size:small;background-color:#FFFFFF;">
<img data-media-type="image" src="file://D:/%E6%9C%89%E9%81%93%E4%BA%91%E7%AC%94%E8%AE%B0/%E6%95%B0%E6%8D%AE%E7%9B%AE%E5%BD%95/zr2095@163.com/a7cbdda00332474cb9378346fb6ef143/row%20format.gif" data-attr-org-src-id="A122985FB1464867BD0426778D61FDC5" data-attr-org-img-file="file:///D:/%E6%9C%89%E9%81%93%E4%BA%91%E7%AC%94%E8%AE%B0/%E6%95%B0%E6%8D%AE%E7%9B%AE%E5%BD%95/zr2095@163.com/a7cbdda00332474cb9378346fb6ef143/row%20format.gif" style="background-color:inherit;cursor:default;display:inline-block;margin-top:8px;max-width:800px;" /><img src="/attachment/201510/6/30208428_1444142208n4mC.gif" width="479" height="395" alt="" />
</div>
<div style="white-space:normal;widows:auto;color:#222222;font-family:Tahoma, sans-serif;font-size:small;background-color:#FFFFFF;">
<br style="background-color:inherit;" />
</div>
<div style="white-space:normal;widows:auto;color:#222222;font-family:Tahoma, sans-serif;font-size:small;background-color:#FFFFFF;">
<br style="background-color:inherit;" />
<span style="font-size:14.6899995803833px;line-height:1.5;"><b style="background-color:inherit;">Row Header</b></span>
</div>
<div style="white-space:normal;widows:auto;color:#222222;font-family:Tahoma, sans-serif;font-size:small;background-color:#FFFFFF;">
<p style="background-color:inherit;">
Oracle Database uses the row header to manage the row piece stored in the block. The row header contains information such as the following:
</p>
<ul style="margin-top:0px;margin-bottom:0px;background-color:inherit;">
<li style="background-color:inherit;">
<p style="background-color:inherit;">
Columns in the row piece
</p>
</li>
<li style="background-color:inherit;">
<p style="background-color:inherit;">
Pieces of the row located in other data blocks
</p>
<p style="background-color:inherit;">
If an entire row can be inserted into a single data block, then Oracle Database stores the row as one row piece. However, if all of the row data cannot be inserted into a single block or an update causes an existing row to outgrow its block, then the database stores the row in multiple row pieces (see<a href="file://C:/Users/ZhuRui/AppData/Local/Youdao/YNote/editor/web/editor.html#BABEEAAE" style="background-color:inherit;cursor:pointer;color:#72007C;">"Chained and Migrated Rows"</a>). A data block usually contains only one row piece per row.
</p>
</li>
<li style="background-color:inherit;">
<p style="background-color:inherit;">
Cluster keys for <a href="file://C:/Users/ZhuRui/AppData/Local/Youdao/YNote/editor/web/glossary.htm#BGBCACEI" style="background-color:inherit;cursor:pointer;color:#72007C;"><span style="background-color:inherit;font-weight:bold;">table clusters</span></a> (see <a href="file://C:/Users/ZhuRui/AppData/Local/Youdao/YNote/editor/web/tablecls.htm#i25478" style="background-color:inherit;cursor:pointer;color:#72007C;">"Overview of Table Clusters"</a>)
</p>
</li>
</ul>
<p style="background-color:inherit;">
A row fully contained in one block has at least 3 bytes of row header.
</p>
<p style="background-color:inherit;">
<span style="line-height:1.5;"> 行頭包含的信息:</span>
</p>
<p style="background-color:inherit;">
行片斷中的列、位于其他數據塊的行片斷的位置、聚簇表的關鍵字。
</p>
<p style="background-color:inherit;">
一行在數據塊中被完全包含至少需要3btyes的行頭空間。
</p>
</div>
<div style="white-space:normal;widows:auto;color:#222222;font-family:Tahoma, sans-serif;font-size:small;background-color:#FFFFFF;">
<h6 style="background-color:inherit;font-size:14.6899995803833px;">
Column Data
</h6>
<p style="background-color:inherit;">
After the row header, the column data section stores the actual data in the row. The row piece usually stores columns in the order listed in the <code style="font-size:12px;background-color:inherit;">CREATE TABLE </code>statement, but this order is not guaranteed. For example, columns of type <code style="font-size:12px;background-color:inherit;">LONG</code> are created last.
</p>
<p style="background-color:inherit;">
As shown in <a href="file://C:/Users/ZhuRui/AppData/Local/Youdao/YNote/editor/web/editor.html#i20134" style="background-color:inherit;cursor:pointer;color:#72007C;">Figure 12-7</a>, for each column in a row piece, Oracle Database stores the column length and data separately. The space required depends on the data type. If the data type of a column is variable length, then the space required to hold a value can grow and shrink with updates to the data.
</p>
<p style="background-color:inherit;">
Each row has a slot in the row directory of the data block header. The slot points to the beginning of the row.
</p>
<p style="background-color:inherit;">
在行頭后面,列數據部分存儲了行的真實數據。行片通常存儲在CREATE TABLE命令中列出的列,但是命令不能夠保證這一點。例如,LONG類型的列創建時。
</p>
<p style="background-color:inherit;">
如上圖所示,對行片中的每一個列,oracle數據庫都單獨地存儲列的長度和數據。所需要的空間取決于數據類型。如果列的數據類型是可變長度,那么空間需要保持為一個可被update的增長和壓縮的值。
</p>
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
<h6 style="font-size:14.6899995803833px;font-family:Tahoma, sans-serif;color:#222222;">
Rowid Format
</h6>
<p style="font-size:small;font-family:Tahoma, sans-serif;color:#222222;">
Oracle Database uses a <a href="file://C:/Users/ZhuRui/AppData/Local/Youdao/YNote/editor/web/glossary.htm#CHDEFIHG" style="background-color:inherit;cursor:pointer;color:#72007C;"><span style="background-color:inherit;font-weight:bold;">rowid</span></a> to uniquely identify a row. Internally, the rowid is a structure that holds information that the database needs to access a row. A rowid is not physically stored in the database, but is inferred from the file and block on which the data is stored.
</p>
<p style="font-size:small;font-family:Tahoma, sans-serif;color:#222222;">
oracle數據庫用rowid來唯一指定一行。rowid是一種保留數據庫需要獲取一行的信息的內在結構。rowid并不會物理存儲在數據庫中,但是是由存儲數據的數據塊或者文件推斷而來(這句話的意思是rowid不是數據庫數據,但是它仍然占用了磁盤空間)。
</p>
<p style="font-size:small;font-family:Tahoma, sans-serif;color:#222222;">
<br />
</p>
<p style="font-size:small;font-family:Tahoma, sans-serif;color:#222222;">
An <span style="background-color:inherit;font-weight:bold;">extended rowid</span> includes a data object number. This rowid type uses a base 64 encoding of the physical address for each row. The encoding characters are <code style="font-size:12px;background-color:inherit;">A-Z</code>, <code style="font-size:12px;background-color:inherit;">a-z</code>, <code style="font-size:12px;background-color:inherit;">0-9</code>, <code style="font-size:12px;background-color:inherit;">+</code>, and <code style="font-size:12px;background-color:inherit;">/</code>.
</p>
<p style="font-size:small;font-family:Tahoma, sans-serif;color:#222222;">
可擴展的rowid包括數據對象號碼。這種rowid類型對每個數據行的物理地址使用了base 64 編碼。這種編碼字符包括:A-Z,a-z,0-9,+和 /。
</p>
<p style="font-size:small;font-family:Tahoma, sans-serif;color:#222222;">
<br />
</p>
<p style="font-size:small;font-family:Tahoma, sans-serif;">
<span style="background-color:inherit;"><b style="background-color:inherit;">Example </b></span><span style="background-color:inherit;color:#222222;"> queries the </span><code style="color:#222222;font-size:12px;background-color:inherit;">ROWID</code><span style="background-color:inherit;color:#222222;"> </span><span style="background-color:inherit;color:#000000;"><span style="background-color:inherit;font-weight:bold;">pseudocolumn</span> </span><span style="background-color:inherit;color:#222222;">to show the extended rowid of the row in the </span><code style="color:#222222;font-size:12px;background-color:inherit;">employees</code><span style="background-color:inherit;color:#222222;"> table for employee 100.</span>
</p>
<div style="font-size:small;font-family:Tahoma, sans-serif;color:#222222;">
<p style="font-style:italic;font-weight:bold;background-color:inherit;">
ROWID Pseudocolumn
</p>
<pre style="font-size:12px;background-color:#EEEEEE;">SQL> SELECT ROWID FROM employees WHERE employee_id = 100;
ROWID
------------------
AAAPecAAFAAAABSAAA
</pre>
</div>
<p style="font-size:small;font-family:Tahoma, sans-serif;">
<span style="background-color:inherit;">Figure 12-8</span><span style="background-color:inherit;color:#222222;"> illustrates the format of an extended rowid.</span>
</p>
<div style="font-size:small;font-family:Tahoma, sans-serif;color:#222222;">
<p style="font-style:italic;font-weight:bold;background-color:inherit;">
<img data-media-type="image" src="file://D:/%E6%9C%89%E9%81%93%E4%BA%91%E7%AC%94%E8%AE%B0/%E6%95%B0%E6%8D%AE%E7%9B%AE%E5%BD%95/zr2095@163.com/60596393361a4eea9a36ae3600d81e97/rowid%20format.gif" data-attr-org-src-id="39408132C3204A6382CB72E16AAA6D70" data-attr-org-img-file="file:///D:/%E6%9C%89%E9%81%93%E4%BA%91%E7%AC%94%E8%AE%B0/%E6%95%B0%E6%8D%AE%E7%9B%AE%E5%BD%95/zr2095@163.com/60596393361a4eea9a36ae3600d81e97/rowid%20format.gif" style="background-color:inherit;cursor:default;display:inline-block;margin-top:8px;max-width:800px;" />
</p>
<br style="background-color:inherit;" />
</div>
<p style="font-size:small;font-family:Tahoma, sans-serif;color:#222222;">
An extended rowid is displayed in a four-piece format, <code style="font-size:12px;background-color:inherit;">OOOOOOFFFBBBBBBRRR</code>, with the format divided into the following components:
</p>
<ul style="margin-top:0px;margin-bottom:0px;background-color:inherit;">
<li style="font-size:small;font-family:Tahoma, sans-serif;color:#222222;">
<p style="background-color:inherit;">
<code style="font-size:12px;background-color:inherit;">OOOOOO</code>
</p>
<p style="background-color:inherit;">
The <span style="background-color:inherit;font-weight:bold;">data object number</span> identifies the segment (data object <code style="font-size:12px;background-color:inherit;">AAAPec</code> in <a href="file://C:/Users/ZhuRui/AppData/Local/Youdao/YNote/editor/web/editor.html#BABJJJIB" style="background-color:inherit;cursor:pointer;color:#72007C;">Example 12-1</a>). A data object number is assigned to every database segment. Schema objects in the same segment, such as a <a href="file://C:/Users/ZhuRui/AppData/Local/Youdao/YNote/editor/web/glossary.htm#CHDJGGGF" style="background-color:inherit;cursor:pointer;color:#72007C;"><span style="background-color:inherit;font-weight:bold;">table cluster</span></a>, have the same data object number.
</p>
</li>
<li style="font-size:small;font-family:Tahoma, sans-serif;color:#222222;">
<p style="background-color:inherit;">
<code style="font-size:12px;background-color:inherit;">FFF</code>
</p>
<p style="background-color:inherit;">
The tablespace-relative <span style="background-color:inherit;font-weight:bold;">data file number</span> identifies the data file that contains the row (file <code style="font-size:12px;background-color:inherit;">AAF</code> in <a href="file://C:/Users/ZhuRui/AppData/Local/Youdao/YNote/editor/web/editor.html#BABJJJIB" style="background-color:inherit;cursor:pointer;color:#72007C;">Example 12-1</a>).
</p>
</li>
<li style="font-size:small;font-family:Tahoma, sans-serif;color:#222222;">
<p style="background-color:inherit;">
<code style="font-size:12px;background-color:inherit;">BBBBBB</code>
</p>
<p style="background-color:inherit;">
The <span style="background-color:inherit;font-weight:bold;">data block number</span> identifies the block that contains the row (block <code style="font-size:12px;background-color:inherit;">AAAABS</code> in <a href="file://C:/Users/ZhuRui/AppData/Local/Youdao/YNote/editor/web/editor.html#BABJJJIB" style="background-color:inherit;cursor:pointer;color:#72007C;">Example 12-1</a>). Block numbers are relative to their data file, not their tablespace. Thus, two rows with identical block numbers could reside in different data files of the same tablespace.
</p>
</li>
<li style="font-size:small;font-family:Tahoma, sans-serif;color:#222222;">
<p style="background-color:inherit;">
<code style="font-size:12px;background-color:inherit;">RRR</code>
</p>
<p style="background-color:inherit;">
The <span style="background-color:inherit;font-weight:bold;">row number</span> identifies the row in the block (row <code style="font-size:12px;background-color:inherit;">AAA</code> in <a href="file://C:/Users/ZhuRui/AppData/Local/Youdao/YNote/editor/web/editor.html#BABJJJIB" style="background-color:inherit;cursor:pointer;color:#72007C;">Example 12-1</a>).
</p>
<p style="background-color:inherit;">
<br />
</p>
</li>
<li style="background-color:inherit;">
<span style="line-height:1.5;font-size:12px;"><span style="background-color:inherit;color:#222222;font-family:monospace;">數據對象編號指定了段。數據對象編號被分配給每個段。在相同段中的方案對象,例如聚簇表,擁有相同的數據對象編號。</span></span>
</li>
<li style="background-color:inherit;">
<span style="line-height:1.5;font-size:12px;"><span style="background-color:inherit;color:#222222;font-family:monospace;">表空間相關的數據文件編號指定了包含行的數據文件。</span></span>
</li>
<li style="background-color:inherit;">
<span style="line-height:1.5;font-size:12px;"><span style="background-color:inherit;color:#222222;font-family:monospace;">行編號指定了數據塊中的行。</span></span>
</li>
</ul>
</div>
<div style="white-space:normal;widows:auto;font-family:Tahoma, sans-serif;font-size:small;background-color:#FFFFFF;">
<span style="color:#222222;line-height:1.5;">After a rowid is assigned to a row piece, the rowid can change in special circumstances. For example, if </span><span style="color:#222222;line-height:1.5;font-weight:bold;">row movement</span><span style="color:#222222;line-height:1.5;"> is enabled, then the rowid can change because of partition key updates, Flashback Table operations, shrink table operations, and so on. If row movement is disabled, then a rowid can change if the row is exported and imported using Oracle Database utilities.</span>
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
<span style="color:#222222;font-family:Tahoma, sans-serif;font-size:small;line-height:1.5;">在一個rowid分配給一個行片后,rowid能夠在特殊的環境下改變。例如,如果行移動開啟了,那么rowid能夠</span><span style="color:#222222;font-family:Tahoma, sans-serif;font-size:small;line-height:1.5;">因為分區鍵更新、閃回表操作、壓縮表等</span><span style="color:#222222;font-family:Tahoma, sans-serif;font-size:small;line-height:1.5;">改變。如果行遷移關閉了,那么如果行使用oracle工具進行導入導出時,rowid會改變。</span>
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
<br style="background-color:inherit;" />
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
<b style="background-color:inherit;">2.2.1.6 可用空間區</b>
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
在插入新數據行,或在更新數據行需要更多空間時(例如,原來某行最后一個字段為空(trailing null),現在要更新為非空值),將 使用可用空間區(free space)中的空間。
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
如果一個數據塊(data block)屬于表或簇表的數據段(data segment),或屬于索引的索引段(index segment),那么在其可用空間區中還可能會存儲事務條目(transaction entry)。如果一個數據塊中的數據行(row)正在由 INSERT,UPDATE,DELETE,及 SELECT...FOR UPDATE 語句訪問,此數據塊中就需要保存事務條目。事務條目所需的存儲空間依據操作系統而定。在常見的操作系統中事務條目大約需要有兩種SQL語句可以增加數據塊中的可用空間:分別是 DELETE 語句,和將現有數據值更新為占用容量更小值的 UPDATE 語句。在以下兩種條件下,上述兩中操作釋放的空間可以被后續的 INSERT 語句使用:
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
<span style="background-color:inherit;line-height:1.5;">如果 INSERT 語句與上述兩種操作在<b style="background-color:inherit;">同一事務(transaction)</b>中,且位于釋放空間的語句之后,那么 INSERT 語句可以使用被釋放的空間。</span>
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
如果 INSERT 語句與釋放空間的語句<b style="background-color:inherit;">在不同的事務中</b>(比如兩者是由不同的用戶提交的),那么只有在釋放空間的語句提交后,且插入數據必需使用此數據塊時,INSERT 語句才會使用被釋放的空間。
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
<b style="background-color:inherit;">數據塊(data block)中被釋放出的空間未必與可用空間區(free space)相連續。Oracle在滿足以下條件時才會將釋放的空間合并到可用空間區:</b>
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
(1)INSERT 或 UPDATE 語句選中了一個有足夠可用空間容納新數據的數據塊;
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
(2)但是此塊中的可用空間不連續,數據無法被寫入到數據塊中連續的空間里。Oracle只在 滿足上述條件時才對數據塊中的可用空間進行合并,這樣做是為了避免過于頻繁的空間合并工作影響數據庫性能。
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
<br style="background-color:inherit;" />
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
<b style="background-color:inherit;">2.2.2.2 行鏈接(Row Chaining)及行遷移(Row Migrating)</b>
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
有兩種情況會導致表中某行數據過大,一個數據塊(data block)無法容納。一種情況是行鏈接( Row Chaining ),
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
另一種情況是行遷移 (Row Migrating)。<span style="background-color:inherit;line-height:1.5;">當數據行發生鏈接(chain)或遷移(migrate)時,對其訪問將會造成 I/O 性能降低,因為Oracle為獲取這些數據行的數據時,必須訪問更多的數據塊(data block)。</span>
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
<br style="background-color:inherit;" />
</div>
<span style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">行鏈接( Row Chaining ):如果我們往數據庫中插入( INSERT )一行數據,這行數據很大,以至于一個數據塊存不下一整行, Oracle 就會把一行數據分作幾段存在幾個數據塊中,這個過程叫行鏈接( Row Chaining )。<span style="background-color:inherit;">在這種情況下Oracle將這行數據存儲在段內的一個數據塊鏈(chain)中。在插入數據量大的行時常會發生行鏈接(row chaining),例如一個包含數據類型為 LONG 或 LONG RAW 列的數據行。此時行鏈接不可避免。</span></span>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
行鏈接又稱為行跨頁(<span style="background-color:inherit;">Oracle允許行跨頁,但DB2是不允許的)。</span>
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
<div style="background-color:inherit;">
<div style="background-color:inherit;">
</div>
<div style="background-color:inherit;">
<div style="background-color:inherit;">
<img data-media-type="image" src="file://D:/%E6%9C%89%E9%81%93%E4%BA%91%E7%AC%94%E8%AE%B0/%E6%95%B0%E6%8D%AE%E7%9B%AE%E5%BD%95/zr2095@163.com/4fd286a8ab9542dcaa2765c24174f151/567124_2579.jpeg" data-attr-org-src-id="A6A9616015AE47BF8A5373C91BAF3EDB" data-attr-org-img-file="file:///D:/%E6%9C%89%E9%81%93%E4%BA%91%E7%AC%94%E8%AE%B0/%E6%95%B0%E6%8D%AE%E7%9B%AE%E5%BD%95/zr2095@163.com/4fd286a8ab9542dcaa2765c24174f151/567124_2579.jpeg" style="background-color:inherit;cursor:default;display:inline-block;margin-top:8px;max-width:800px;font-size:12px;color:#FF9900;line-height:1.5;" />
</div>
<div style="background-color:inherit;">
<img src="/attachment/201510/6/30208428_1444142258fT5J.jpeg" width="516" height="179" alt="" /><br />
<br style="background-color:inherit;" />
</div>
<div style="background-color:inherit;">
<span style="background-color:inherit;"><span style="background-color:inherit;font-size:12px;"></span></span>
</div>
</div>
</div>
</div>
<span style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">行遷移 (Row Migrating) :原本存儲在一個數據塊(data block)內的數據行,因為更新操作導致長度增長,而所在數據塊的可用空間也不能容納增長后的數據行。在這種情況下,Oracle將此行數據遷移(migrate)到新的數據塊中。Oracle在被遷移數據行原來所在位置保存一個指向新數據塊的指針。被遷移數據行的 rowid 保持不變。</span>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
<div style="background-color:inherit;">
<div style="background-color:inherit;">
<div style="background-color:inherit;">
<span style="background-color:inherit;"><span style="background-color:inherit;font-size:12px;"></span></span>
<div style="background-color:inherit;">
<span style="background-color:inherit;"><span style="background-color:inherit;font-size:12px;"><img data-media-type="image" src="file://D:/%E6%9C%89%E9%81%93%E4%BA%91%E7%AC%94%E8%AE%B0/%E6%95%B0%E6%8D%AE%E7%9B%AE%E5%BD%95/zr2095@163.com/416ab60c7c964c6d9a21eaaf92ee83bf/567190_5219.jpeg" data-attr-org-src-id="141D6CC6C6064332AF09DCB4D8E5DCA1" data-attr-org-img-file="file:///D:/%E6%9C%89%E9%81%93%E4%BA%91%E7%AC%94%E8%AE%B0/%E6%95%B0%E6%8D%AE%E7%9B%AE%E5%BD%95/zr2095@163.com/416ab60c7c964c6d9a21eaaf92ee83bf/567190_5219.jpeg" style="background-color:inherit;cursor:default;display:inline-block;margin-top:8px;max-width:800px;" /><img src="/attachment/201510/6/30208428_1444142279sGvc.jpeg" width="516" height="128" alt="" /></span></span>
</div>
</div>
</div>
</div>
<div style="font-family:Arial;">
<span style="background-color:inherit;"><span style="background-color:inherit;font-size:12px;"><br style="background-color:inherit;" />
</span></span>
</div>
<div style="font-family:Arial;">
<span style="background-color:inherit;"><span style="background-color:inherit;font-size:12px;"><br style="background-color:inherit;" />
</span></span>
</div>
<div style="font-family:Arial;">
<span style="background-color:inherit;"><span style="background-color:inherit;font-size:12px;"><span style="font-size:14px;"><span style="background-color:inherit;font-size:12px;"></span></span></span></span>
</div>
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
<span style="background-color:inherit;"><span style="background-color:inherit;"><span style="background-color:inherit;">PCTFREE 參數用于指定塊中必須保留的最小空閑空間百分例。之所以要預留這樣的空間,是因為 UPDATE 時,需要這些空間。如果 UPDATE 時,沒有空余空間, Oracle 就會分配一個新的塊,這會產生行遷移( Row Migrating ),進行空間預留能夠一定程度上保證數據庫訪問效率。</span></span>
<div style="background-color:inherit;">
<span style="background-color:inherit;"><span style="background-color:inherit;">PCTUSED 也是用于設置一個百分比,當塊中已使用的空間的比例小于這個百分比的時候,這個塊才被標識為有效狀態。只有有效的塊才被允許插入數據。</span></span>
</div>
</span>
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
<b style="background-color:inherit;">2.2.3 PCTFREE,PCTUSED,及行鏈接(Row Chaining)</b>
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
在手動管理的表空間(manually managed tablespaces)中,用戶可以使用 PCTFREE 和 PCTUSED 這兩個存儲管理參數來控制對某段(segment)進行插入和更新操作時,如何利用屬于此段的數據塊(data block)中的可用空間。用戶也可以在創建或修改索引時為其設定 PCTFREE 參數(索引存儲在索引段(index segment)中)。
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
<br style="background-color:inherit;" />
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
提示:<span style="background-color:inherit;line-height:1.5;">本節的內容并不適用于 LOB 數據類型(BLOB,CLOB,NCLOB,及 BFILE)。 這些類型的數據存儲時不使用 PCTFREE 參數及可用塊列表(free list)。</span>
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
<b style="background-color:inherit;">2.2.3.1 PCTFREE 參數</b>
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
PCTFREE 參數用來設置一個數據塊(data block)中至少需要保留(reserve)多少可用空間(百分比值),為數據塊中已有數據更新時可能發生的數據量增長做準備。例如,當用戶用 CREATE TABLE 語句創建表時指定了以下參數:<span style="background-color:inherit;line-height:1.5;">PCTFREE 20</span>
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
這個參數設定了此表對應的數據段(data segment)中的每個數據塊(data block)至少保留20%的可用空間,以備塊中已有數據更新時使用。只要數據塊中行數據區與數據塊頭的容量之和不超過數據塊總容量的80%,用戶就可以向其中插入新數據,數據行被放入行數據區(row data area),相關信息被寫入數據塊頭(overhead area)。
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
<b style="background-color:inherit;">2.2.3.2PCTUSED 參數</b>
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
PCTUSED 參數用于決定一個數據塊(data block)是否可被用于插入新數據,她的依據是數據區(row data)與數據塊頭(overhead)的容量之和占數據塊全部容量的最大百分比。當一個數據塊中的可用空間比例小于 PCTFREE 參數的規定時,Oracle就認為此數據塊無法被用于插入新數據,直到數據塊中的占用容量比例小于 PCTUSED 參數的限定。在占用容量比例大于 PCTUSED 參數的限定之前,Oracle只在更新數據塊內已有數據時才會使用此數據塊的可用空間。例如,當用戶用 CREATE TABLE 語句創建表時指定了以下參數:<span style="background-color:inherit;line-height:1.5;">PCTUSED 40,</span><span style="background-color:inherit;line-height:1.5;">當此表的某數據塊占用容量比例高于40%時,Oracle不會將此數據塊用于插入新數據行(假設此數據塊的可用空間曾經低于 PCTFREE 的限定)。</span>
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
<br style="background-color:inherit;" />
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
<b style="background-color:inherit;">2.2.3.4 PCTFREE 和 PCTUSED 如何協同發揮作用</b>
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
PCTFREE 和 PCTUSED 共同作用可以優化數據塊(data block)的空間使用。
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
PCTFREE 和 PCTUSED 如何共同作用以管理數據塊(data block)可用空間的使用。
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
<br style="background-color:inherit;" />
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
對于上述PCTFREE=20,PCTUSED=40的例子,oracle采用如下機制來管理數據塊空間:
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
a.數據塊占用空間比例小于80%時才能插入新數據,因為 PCTFREE 參數限定必須保留20%的可用空間用于塊內已有數據的更新。
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
b.對數據塊中已有數據的更新操作可以使用數據塊中的保留空間。只有當數據塊內的占用空間比例低于40%時才能向其中插入新數據。
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
c.當數據塊內的占用空間比例低于40%時,此數據塊再次可以被用于插入新數據。
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
d.數據塊占用空間比例小于80%時才能插入新數據,因為 PCTFREE 參數限定必須保留20%的可用空間用于塊內已有數據的更新。此過程如此往復循環。
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
在新分配的數據塊中(data block),可用于插入(insert)數據的空間等于數據塊總容量減去數據塊頭(block overhead)再減去預留可用空間(PCTFREE)。而更新(update)數據塊內已有數據可使用數據塊中的所有可用空間。因此,更新操作能夠使數據塊內的可用空間低于的 PCTFREE 限制,因為這些空間是專為更新操作而預留的。
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
在每個數據段(data segment)與索引段(index segment)中,Oracle管理著一個或多個可用塊列表(free list)--其中列出了所有屬于此段的數據擴展(extent),且可用空間比例大于 PCTFREE 限定的數據塊。這些塊可以被插入(insert)操作使用。當用戶提交了 INSERT 語句后,Oracle從可用塊列表中選擇第一個有效的數據塊使用。如果此數據塊的可用空間不夠容納 INSERT 語句提交的數據,且此塊的占用容量已經超過PCTUSED 的限定,Oracle就將其從可用塊列表中移出。一個段可以同時使用多個可用塊列表,以減少對一個表進行并發插入(concurrent insert)時產生的競爭。
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
當用戶提交了 DELETE 或 UPDATE 語句后,Oracle處理語句并檢查相關數據塊中的占用空間比例是否小于 PCTUSED 的規定。如果滿足,那么這個數據塊就被放入當前事務(transaction)正在使用的可用塊列表(free list)的頭部,如果當前事務還需要寫入數據,此塊將被首先使用。當事務提交后,此數據塊中的可用空間還可被其他事務使用。
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
<br style="background-color:inherit;" />
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
<b style="background-color:inherit;">2.3 數據擴展區概述</b>
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
數據擴展區(extent)是由一組連續的數據塊(data block)構成的數據庫邏輯存儲分配單位(一般由8個block組成)。而段(segment)則是由一個或多個數據擴展區構成。當一個段中已有空間已經用完,Oracle為這個段分配新的數據擴展區。
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
<br style="background-color:inherit;" />
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
<b style="background-color:inherit;">2.3.1 數據擴展何時被分配</b>
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
當用戶創建數據表時,Oracle為此表的數據段(data segment)分配一個包含若干數據塊(data block)的初始數據擴展區(initial extent)。雖然此時數據表中還沒有數據,但是在此初始數據擴展區中的數據塊已經為插入新數據做好了準備。
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
如果一個段(segment)的初始數據擴展區(initial extent)中的數據塊(data block)都已裝滿,且有新數據插入需要空間時,Oracle自動為這個段分配一個增量數據擴展區(incremental extent)。增量數據擴展區是一個段中繼已有數據擴展區之后分配的后續數據擴展區,她的容量大于或等于之前的數據擴展區。
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
為了管理的需要,每個段(segment)的段頭(header block)中包含一個記錄此段所有數據擴展區(extent)的目錄。
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
</div>
<div>
<br />
</div>