Oracle 存儲結構一


了解塊中表行數據的存儲

Oracle數據存儲模型

邏輯結構在左,物理結構在右

 有一個關系使用虛線繪制,表示段與數據文件的多對多關系。之所以使用虛線表示關系,是因為這種多對多關系不應存在。

表空間實體消除了段與數據文件之間的多對多關系。一個表空間可以包含多個段,而且可以由多個數據文件組成。這意味着,一個段可以分布在多個數據文件中,而任一數據文件可以包含多個段的全部或一部分。

“段”實體表示存儲數據從而需要表空間中的空間的任何數據庫對象。典型的段是表,但也存在其他段類型,主要是索引段和撤銷段。任何一個段可以僅存在於一個表空間中。

Oracle塊是數據庫的基本I/O單元。數據文件設置為連續編號的oracle塊。對於表空間而言,Oracle塊的大小固定不變(一般而言,數據庫中多有表空間的塊大小都是相同的),默認大小是8KB。行可能只有數百個字節,因此,一個塊中可能有多個行,但在會話需要行時,將從磁盤將整個塊讀入到數據庫緩沖區緩存中。同樣,如果數據庫緩沖區緩存中的一行中的一列發生了變化,DBWn最終也將整個塊協會到源數據文件中,從而覆蓋以前的版本。塊大小由DB_BLOCK_SIZE參數控制。在創建數據庫后,DB_BLOCK_SIZE用於設置構成SYSTEM表空間的數據文件的格式,所以固定不變。如果后來發現塊大小不合適,唯一辦法是新建一個數據庫,並將所有數據傳輸到其中。塊由數據文件中的編號唯一標識,僅塊號是不夠的。

如果在管理空間時,每次僅管理一個塊,那么將是一項棘手的任務,為此,又將塊組合成了區間。區間是一個數據文件中一組連續編號的Oracle塊。這些區間可能位於構成表空間的任何或所有數據文件中。可以根據段的維度(區間根據每個段連續編號,從零開始)或數據文件的維度(每個區間在一個文件中,從某個Oracle塊編號開頭)確定。

段、區間、塊和行

數據存儲在段中。數據字典視圖DBA_SEGMENTS描述了數據庫中的每個段。

SYS@ prod>select segment_type,count(1) from dba_segments group by segment_type order by segment_type;

SEGMENT_TYPE         COUNT(1)
------------------ ----------
CLUSTER                    10
INDEX                    2379
INDEX PARTITION           300
LOB PARTITION               1
LOBINDEX                  724
LOBSEGMENT                724
NESTED TABLE               33
ROLLBACK                    1
TABLE                    1625
TABLE PARTITION           144
TYPE2 UNDO                 10

11 rows selected.

SYS@ prod>

 

段類型:

  • TABLE 這些是堆結構的表,其中包含以隨機順序存儲的變長度的數據行。雖然典型的段是表段,但要注意,不能說表就是段,還有更復雜的表組織使用其他段類型。
  • INDEX 索引是鍵值的有序列表,相應的指針ROWID指向每行的物理位置。ROWID指定行位於哪個數據文件的那個Oracle塊中,並指定行在塊中的編號。
  • TYPE2 UNDO 這些是撤銷段(不能講它們稱為“type2 undo”段),存儲數據的更改前版本,為了提供完整性(回滾,讀取一致性和隔離),這些是必需的。
  • TABLE PARTITION 可以將表分成多個區。如果這樣的話,分區將稱為一個個的段,而表本身完全不是段:僅以分區綜合的形式存在。堆表的每個表分區在本身的表段中,成為堆表結構。這些段可能使用不同的表空間,這意味着,可以將一個表分布到多個表空間中。
  • INDEX PARTITION 默認方式下,一個索引在一個段中,但是,也可以對索引進行分區。如果對表進行分區,通常也會對這些表上的索引進行分區。
  • LOBSEGMENT、LOBINDEX、LOB PARTITION如果將列定義為大對象數據類型,那么,僅在表本身存儲一個指針,此指針指向列數據實際所在的不同段中的條目。LOB可以擁有在此基礎上構建的索引以便快速訪問對象中的數據,另外,可以對LOB進行分區。
  • CLUSTER Cluster段包含多個表。分區將一個表分布在多個段中,而Cluster與此相反,允許將多個表反規范化(denormalize)為一個段。
  • NESTED TABLE 如果將一個表列定義為本身就具有列的用戶定義的對象類型,那么,列可以作為嵌套表,存儲在自身的段中。
  • ROLLBACK 

每個段都有一個或多個區間。創建段時,Oracle將在指定的任何表空間中為其分配區間。最后,隨着數據的輸入,區間將被填滿。此后,Oracle將在同一表空間(但不一定在同一個數據文件中)分配第二個區間。如果知道段需要更多空間,則可以手動分配區間。如何精確地確定段的位置:

SYS@ prod>create table scott.newtab(c1 date) segment creation immediate;

Table created.

SYS@ prod>select tablespace_name,file_id,extent_id,block_id,blocks,bytes
  2  from dba_extents where owner='SCOTT' and segment_name='NEWTAB';

TABLESPACE_NAME                   FILE_ID  EXTENT_ID   BLOCK_ID     BLOCKS      BYTES
------------------------------ ---------- ---------- ---------- ---------- ----------
USERS                                   4          0        528          8      65536

SYS@ prod>alter table scott.newtab allocate extent;

Table altered.

SYS@ prod>select tablespace_name,file_id,extent_id,block_id,blocks,bytes
  2  from dba_extents where owner='SCOTT' and segment_name='NEWTAB';

TABLESPACE_NAME                   FILE_ID  EXTENT_ID   BLOCK_ID     BLOCKS      BYTES
------------------------------ ---------- ---------- ---------- ---------- ----------
USERS                                   4          0        528          8      65536
USERS                                   4          1        536          8      65536
SYS@ prod>select tablespace_name,file_name from dba_data_files where file_id=4;

TABLESPACE_NAME
------------------------------
FILE_NAME
------------------------------------------------------------------------------------------------------------------------------------------------------
USERS
/u01/oradata/prod/users01.dbf

SYS@ prod>

 第一個命令完全依賴於存儲的默認設置創建表SCOTT.NEWTAB。此后,針對DBA_EXTENTS的查詢顯示此段僅包含一個區間(區間編號0)。此區間位於文件編號4中,長度為8個塊。在8個塊中,第一個塊的編號是528。區間大小是64KB,塊大小是8KB。下一個命令強制Oracle在即使第一個區間不滿的情況下將另一個區間分配給段。下一個查詢顯示,此區間編號為1,也在文件編號4中,正好從區間0之后開始。注意,無法從上面例子中清晰地判斷表空間是否由多個數據文件組成,這是因為Oracle計算出在何處分配下一個區間的算法並不接着僅使用數據文件。如果表空間確實由多個數據文件組成,則可以使用下列語法重寫Oralce的選擇:

ALTER TABLE tablename ALLOCATE EXTENT STORAGE (DATAFILE 'filename');

最后一個查詢繼續查看DBA_FILES來確定區間分配到的文件的名稱,以及數據文件所屬的表空間的名稱。為了確定表的表空間,也可以查詢DBA_SEGMENTS視圖。

一個區間有一組連續編號的塊組成。每個塊都包含標題區域和數據區域。標題的大小可變,從塊的頂部向下延伸。除了其他信息之外,行標題還包含行目錄(列出每行在塊中的開始位置)和行鎖信息。數據區域按由下而上的方式填充。二者之間可能有空閑空間,也可能沒有。

可以導致塊標題增長的事件包括插入和鎖定行。數據區域一開始是空的,隨着在其中插入行(對於索引段的塊,將插入索引項),它將變滿。隨着行的插入、刪除和更新(可能導致行大小的更改),空閑空間中會出現碎片,但這無關緊要,因為在將塊復制到數據庫緩沖區緩存中的緩沖區后,這些都在內存中發生。在必要時,會在DBWn將塊寫回數據文件之前,將空閑空間接合稱一個連續區域。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM