本章主要介紹Oracle資料庫的邏輯儲存結構及其關係,包括以下內容
一、介紹data block,extent,segment
二、Data Block綜述
三、Extent綜述
四、Segment綜述
一、介紹
資料區塊(Block):資料區塊是oracle的儲存單位,也叫邏輯塊,oracle塊,是物理磁碟的一個空間。
區(Extent):一組資料區塊構成一個區。
段(Segment):由一組區構成,被分配到一個特定的資料結構中,段只能儲存於一個資料表空間中,不能跨越資料表空間儲存
當構成一個段的所有區空間滿了後,系統需要分配其他的區給該段以便儲存資料,這些新增的區可能是臨近的也可能不是臨近的。
段以及構成段的所有區只能存在於一個資料表空間中,但是段是可以跨越資料檔案的,而區是不能跨越資料檔案的。
如果分配一個區到一個特定的場合,那麼區所包含的資料區塊同時也被分配過去。
如果區沒有被分配到一個特定的場合,那麼他所對應的資料區塊只有在高水位線改變的時候才會被分配。
高水位線是段中使用和為使用空間的一個分界線。
二、資料區塊綜述
oracle通過資料區塊管理資料檔案中的儲存空間。資料區塊是資料存放區的最小單位。在作業系統中,資料都是以位的方式進行儲存。
每個作業系統都有個block size,而oracle中的data block size是作業系統資料區塊大小的倍數。在oracle中,資料區塊的大小由
初始化參數db_block_size決定。
資料區塊包含了header(包含基本資料,比如塊地址,段類型),table directory(),rowdirectory,free space,row data
其中header,table directory,row directory統稱為overhead,overhead大小有些固定有些可變,平均下來overhead大小
在84--107bytes之間。
row data 包含 table data或者index data。row可以跨越block
free space分配給那些需要增加額外空間以便insert或者update 資料。
Free Space Management
可以手動或者自動管理。bitmap方式對空間進行管理。當建立本地化管理資料表空間後,段空間即為自動管理,同時在該資料表空間
建立的其他段也同樣為自動管理。
當free space不連續時,向該段insert資料,oracle會對這些不連續的block進行壓縮、接合處理,這將降低資料庫的效能,
因此僅到出現block不連續時,資料庫才會做如此操作。
Row Chaining and Migrating
當一條記錄特別大,一個block不足以儲存時,oracle會把這條記錄儲存在多個block中,並且把這些block串連起來,當成一個block
處理,這種情況在long和long raw型中經常出現。
當一條記錄儲存在一個block中,現被update,該blcok的空閑空間被佔滿,那麼oracle將把這條記錄從以前的block中移動到一個
新的block中儲存,row id將不會改變。
當以上兩種情況發生時,I/O效能會降低,因為oracle查詢這條記錄時將掃描不止一個block
PCTFREE PCTUSED
The PCTFREE parameter sets the minimum percentage of a data block to be
reserved as free space for possible updates to rows that already exist in that block.
PCTFREE定義一個資料區塊的最小空閑百分比。如在create table是設定了PCTFREE 20,那麼這個segment中的每個資料區塊空間最多被insert佔用到80%,剩下的20%,用來給update已經存在於該塊中的資料用。
The PCTUSED parameter sets the minimum percentage of a block that can be used
for row data plus overhead before new rows are added to the block.
PCTUSED定義一個資料區塊能被insert 時的該塊最小的空間佔用百分比。如在create table時設定了PCTUSED 40,那麼只有當佔用百分比小於40%時,該塊才能再次被insert資料。
此時感覺PCTFREE和PCTUSED有些矛盾,且看下面的定義。
PCTFREE、PCTUSED一起作用
在一個新分配的塊中能用於insert 的空間為塊大小減去 塊頭(overhead)及PCTFREE空間的總和後剩下的空間。update可以使一個資料區塊的可用空間小於PCTFREE。
每個data segment或者index segment都有多個free list,只有那些空閑空間大於PCTFREE且使用空間小於PCTUSED的塊才會存在於FREE list中,可被選用。當發起insert時,ORACLE會檢查free list中第一個可用塊,當該塊的空閑空間不足以滿足該insert,該塊將被ORACLE從該free list中丟棄。當insert並發時,一個段有多樣的freelist 可以減少對freelist的競爭。
當一個新的塊被用來insert時,最多能被使用到80%的空間,剩下20%用來update已經存在於該塊中的資料,當佔用率到了80%以後,如果該塊的使用率一直在40%以上,那麼將不能在insert into 資料到該塊中。只要當該塊的使用率變化到40%以下時,該塊才會出現在free list中,且該塊才可能被再次insert into資料,且最多insert 到80%。
當delete或者update 發生後,oracle會檢查該塊的可用空間,如果可用空間小於PCTUSED時,該塊將被放到freelist中的起始位置供該事務使用,當commit後,可以被其他的transaction使用。
三、extent 綜述
extent是資料庫分配儲存空間的一個邏輯單位,extent組成segment,構成段的extent的空間被使用完後,資料區塊立即分配新的區給segment使用。
When Extents Are Allocated
當建立一個表時,Oracle會分配一個初始的且指定block數量的extent給這個segment,即便沒有行資料被insert into 這個表,與初始區對應的資料區塊還是為這個表的行資料保留的。當初始區空間被佔滿,且需要更多的空間來滿足需求時,oracle自動的分配incremental extent以滿足需求。
Determine The Number and Size of Extent
Storage Parameter表達了每個段中區的定義。storage parameter適用各種類型的segment,他們控制了空閑空間是如何分配給段的,比如你可以確定一個資料表需要分配多大的空間做為了初始空間,或者你可以根據create table時指定的儲存參數限制分配給段的區個數。如果沒有給一個段指定儲存參數,那麼將適用tablespace 的一些預設儲存參數。
不管區管理方式是否明確指定,由於本地化管理的方式在效能上由於資料字典管理方式,非system的永久資料表空間都是本地化方式管理(local managed)。
在建立資料表空間時如果指定uniform,則指定了資料表空間的區為統一的大小,如果指定autoallocate則資料表空間的區大小為系統自動管理,是可變的。
對於uniform的方式管理區,指定區大小也可以使用預設的區大小,預設區大小為1M,暫存資料表空間只能使用這種方式對區進行管理。
對於system-manage的方式管理區,ORacle確定增加區的最佳大小為最小64K,永久使用的資料表空間都預設是對區進行自動管理的。
儲存參數initial,next,minextents,pctincrease並不是在tablespace這一級指定,是在段這一級指定。
How Extents Are Allocated
根據是本地管理資料表空間還是資料字典管理資料表空間,oracle利用不同的運演算法則來分配區。本地化管理資料表空間,Oracle為一個新的區分配空閑空間時,在資料表空間中的一個候選datafile中尋找所需的臨近的空閑空間的block數量,如果數量不能滿足需求,那麼將尋找下一個datafile。注意,區是不能跨越資料檔案的。
When Extents Are Deallocated
通常情況下,只有在drop對象時,所佔用的空間才會被釋放給相應的資料表空間。除非在以下情況:
1、truncate ......drop storage
2、alter table table_name deallocate unused;
SQL> select sum(blocks) from dba_extents where segment_name='CLUB_BOOK_INFO_BAK1230';
SUM(BLOCKS)
-----------
2432
SQL> alter table club_book_info_bak1230 deallocate unused;
Table altered.
SQL> select sum(blocks) from dba_extents where segment_name='CLUB_BOOK_INFO_BAK1230';
SUM(BLOCKS)
-----------
2336
3、當給復原段指定了最佳大小時,oracle會周期性的釋放復原段的空間。
當區變成free時,如果是本地化管理資料表空間,oracle會修改位於資料檔案中的位元影像(bitmap),如果是字典管理資料表空間oracle會更新資料字典。
Extents in nonclusterd Tables
當你對非聚簇執行delete 後,不會釋放這個表所佔用的extents,只有當你drop時ORacle才會回收所佔用的extents給這個資料表空間的其他需要空間的段。
Extents in clusterd Tables
當對聚簇的一個表進行drop後,並不能釋放分配給他的區,因為聚簇的資料並不是給一個表用的。還包括了其他表的資料。
Extents in materialized views and their logs
在物化視圖及其日誌中,對區的釋放和表及聚簇方式一樣。
Extents in index
drop index後,釋放相應的區。
Extents in temporary Segments
Oracle 完成一個需要臨時段的任務後,會自動釋放這個臨時段。當多重排序完成後,並不釋放臨時段,而是保持其對其他的排序可用。當一個事務完成後,Oracle會把臨時段drop掉並且返回臨時段所分配的空間給暫存資料表空間。
Extents in Rollback Segments
Oracle會周期性的檢查復原段,看他們的大小是否超過了一個設定的最佳值,當超過最佳值後,Oracle自動的是否一個或多個區。
四、Segment綜述
段是由區組成的,資料區段由Oracle分配一個或者多個區組成,索引段也同樣是由Oracle分配的一個或者多個區組成的。
本節包含以上內容:
資料區段介紹
索引段介紹
臨時段介紹
復原段自動管理
Introduction to Data Segment
在Oracle資料庫中,一個單一的資料區段儲存著所有的資料庫,資料區段有以下形式:
1、非分區表
2、分區表的分區
3、聚簇
當用CREATE建立一個表或者聚簇,Oracle為他們建立資料區段。儲存參數決定了構成資料區段的區是如何分配的。可以用CREATE或者ALTER設定這些儲存參數,這些儲存參數影響了資料恢複和儲存的效率。
Introduction to Index Segments
非分區索引有一個索引段,分區索引一個分區有一個索引段。用CREATE index 建立一個索引或者一個分區索引時,ORacle會自動建立一個索引段��儲存參數決定了索引段的區是如何分配的。可以設定這些儲存參數,他們會影響資料恢複和儲存的效率。
Introduction to Temporary Segments
當執行查詢時,Oracle需要臨時空間來供SQL的分解和執行。臨時段是Oracle自動分配的磁碟空間。Oracle需要一個臨時段作為資料庫空間供排序用。當排序可以在記憶體中完成或者Oracle找到其他的方法利用索引完成,Oracle是不會建立臨時段的。
需要臨時段的操作:
1、create index
2、select....order by
3、select distinct ...
4、select ...group by
5、select ....union
6、select ....intersect
7、select ....minus
Oracle為暫存資料表以及他們的臨時索引分配臨時段。與分配臨時段給查詢相比,分配臨時段給暫存資料表的方式是不一樣的。
Introduction to UNDO Segments
ORACLE強烈推薦使用UNDO資料表空間來自動管理,而不是使用rollback segment來進行管理。可以查看v$undostat視圖,監控和設定資料庫系統所使用的undo space。