標籤:oracle
通過案例學調優之--Oracle資料區塊(block)
資料區塊概述Oracle對資料庫資料檔案(datafile)中的儲存空間進行管理的單位是資料區塊(data block)。資料區塊是資料庫中最小的(邏輯)資料單位。與資料區塊對應的,所有資料在作業系統級的最小實體儲存體單位是位元組(byte)。每種作業系統都有一個被稱為塊容量(block size)的參數。Oracle每次擷取資料時,總是訪問整個數(Oracle)資料區塊,而不是按照作業系統塊的容量訪問資料。
資料庫中標準的資料區塊(data block)容量是由初始化參數 DB_BLOCK_SIZE 指定的。除此之外,使用者還可以指定五個非標準的資料區塊容量(nonstandard block size)。資料區塊容量應該設為作業系統塊容量的整數倍(同時小於資料區塊容量的最大限制),以便減少不必要的I/O操作。Oracle資料區塊是Oracle可以使用和分配的最小儲存單位。
另見:針對特定作業系統的Oracle文檔中包含更多有關資料區塊容量(data block size)的資訊多種資料區塊容量(Multiple Block Sizes)
資料區塊結構在Oracle中,不論資料區塊中儲存的是表(table)、索引(index)或簇表(clustered data),其內部結構都是類似的。
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/47/B5/wKioL1P-nVjj2ZfaAACmmxlgC-w807.gif" title="block.gif" alt="wKioL1P-nVjj2ZfaAACmmxlgC-w807.gif" />
本圖顯示了資料區塊的各個組成部分,包括:資料區塊頭(包括標準內容和可變內容)(common and variable header),表目錄區(table directory),行目錄區(row directory),可用空間區(free space),行資料區(row data)。以下各節將分別講解各個組成部分。圖中兩個箭頭表示一個資料區塊中的可用空間區的容量是可變的。
資料區塊頭(包括標準內容和可變內容)
資料區塊頭(header)中包含了此資料區塊的概要資訊,例如塊地址(block address)及此資料區塊所屬的段(segment)的類型(例如,表或索引)。
表目錄區
如果一個資料表在此資料區塊中儲存了資料行,那麼資料表的資訊將被記錄在資料區塊的表目錄區(table directory)中。
行目錄區
此地區包含資料區塊中儲存的資料行的資訊(每個資料行片斷(row piece) 在行資料區(row data area)中的地址)。[一個資料區塊中可能儲存一個完整的資料行,也可能只儲存資料行的一部分 ,所以文中使用row piece]
當一個資料區塊(data block)的行目錄區(row directory)空間被使用後,即使資料行被刪除(delete),行目錄區空間也不會被回收。舉例來說,當一個曾經包含50條記錄的資料區塊被清空後,其塊頭(header)的行目錄區仍然佔用100位元組(byte)的空間。只有在資料區塊中插入(insert)新資料時,行目錄區空間才會被 重新利用。
管理開銷資料區塊頭(data block header),表目錄區(table directory),行目錄區(row directory)被統稱為管理開銷(overhead)。其中 有些開銷的容量是固定的;而有些開銷的總容量是可變的。資料區塊中固定及可變管理開銷的容量平均在84到107位元組(byte)之間。
行資料資料區塊(data block)中行資料區(row data)包含了表或索引的實際資料。一個資料行可以跨多個資料區塊。這就出現了“行連結(Row Chaining)及行遷移(Row Migrating)
可用空間區在插入新資料行,或在更新資料行需要更多空間時(例如,原來某行最後一個欄位為空白(trailing null),現在要更新為非空值),將 使用可用空間區(free space)中的空間。
如果一個資料區塊(data block)屬於表或簇表的資料區段(data segment),或屬於索引的索引段(index segment),那麼在其可用空間區中還可能會儲存事務條目(transaction entry)。如果一個資料區塊中的資料行(row)正在由 INSERT,UPDATE,DELETE,及 SELECT……FOR UPDATE 語句訪問,此資料區塊中就需要儲存事務條目。事務條目所需的儲存空間依據作業系統而定。在常見的作業系統中事務條目大約需要有兩種SQL語句可以增加資料區塊中的可用空間:分別是 DELETE 語句,和將現有資料值更新為佔用容量更小值的 UPDATE 語句。在以下兩種條件下,上述兩中操作釋放的空間可以被後續的 INSERT 語句使用:
如果 INSERT 語句與上述兩種操作在同一事務(transaction)中,且位於釋放空間的語句之後,那麼 INSERT 語句可以使用被釋放的空間。
如果 INSERT 語句與釋放空間的語句在不同的事務中(比如兩者是由不同的使用者提交的),那麼只有在釋放空間的語句提交後,且插入資料必需使用此資料區塊時,INSERT 語句才會使用被釋放的空間。
資料區塊(data block)中被釋放出的空間未必與可用空間區(free space)相連續。Oracle在滿足以下條件時才會將釋放的空間合并到可用空間區:(1)INSERT 或 UPDATE 語句選中了一個有足夠可用空間容納新資料的資料區塊,(2)但是此塊中的可用空間不連續,資料無法被寫入到資料區塊中連續的空間裡。Oracle只在 滿足上述條件時才對資料區塊中的可用空間進行合并,這樣做是為了避免過於頻繁的空間合并工作影響資料庫效能。
本文出自 “天涯客的blog” 部落格,請務必保留此出處http://tiany.blog.51cto.com/513694/1546050
通過案例學調優之--Oracle資料區塊(block)