1. 程式人生 > >Oracle表空間、段、區和塊簡述

Oracle表空間、段、區和塊簡述



Oracle學習過程中,儲存結構,表段區塊可能是每個初學者都要涉及到的概念。表空間、段、分割槽和資料塊分別表示了Oracle進行資料儲存的不同層次和結構。瞭解清楚這幾個結構,有助於我們奠定一個穩固的學習基礎,而且對於理解Oracle工作原理也有重要作用。

本文采用從小到大,逐步拓展的方式介紹四個結構,並且與Schema、資料檔案的區別進行對比。

資料塊(Block

資料塊BlockOracle儲存資料資訊的最小單位。注意,這裡說的是Oracle環境下的最小單位。Oracle也就是通過資料塊來遮蔽不同作業系統儲存結構的差異。無論是Windows環境,還是Unix/Linux環境,他們的作業系統儲存結構和方式、甚至字元排列的方式都是不同的。

Oracle利用資料塊將這些差異加以遮蔽,全部資料操作採用對Oracle塊的操作,相當於是一個層次的抽象。

Oracle所有對資料的操作和空間分配,實際上都是針對資料塊Block的操作。我們從資料表中搜索出一行,實際中Oracle就會從記憶體緩衝區(或者硬碟)中讀取到該行所在的資料塊,再返回這資料塊上的指定資料行。Oracle無論是在緩衝區,還是在硬碟,進行資料操作的雖小單位也就是資料塊。

資料塊是有大小的,在一個數據庫建立的時候,通過引數進行設定。注意,在Oracle資料庫引數中,只有資料塊大小的引數是建庫之後不能進行修改的。資料塊的大小,在一個數據庫中可以支援多個,但是一般沒有太大的意義,會給管理和除錯帶來一定的負擔。

資料塊的大小是通過kb位元組個數來指定的,預設為8KB。相關引數為db_block_size,下面是檢視block大小的語句。

SQL> show parameter db_block_size;

NAMETYPEVALUE

------------------------------------ ----------- ------------------------------

db_block_sizeinteger8192//1024×8

設定資料塊的大小是依據不同型別的系統的。如果資料塊設定比較大,那麼一次讀取的資料行較多,相應對SGA記憶體消耗比較大,特定查詢引發的換入換出可能較多。如果設定的過小,頻繁的

IO邏輯物理讀也會引起效能問題。

與資料塊有關係的另一個引數就是db_file_multiblock_read_count,表示一次從物理儲存中讀取的資料塊數量。對一些資料探勘系統,可以考慮調節此引數略大一些。

接下來,我們看比block更高的一個單位,區extent

extent

extent是比資料塊大一級的儲存結構,表示的是一連串連續的資料塊集合。我們知道,物理儲存通常是隨機的讀寫過程。即使在同一個檔案裡,我們也不能保證相同的一個資訊是儲存在絕對連續的物理儲存空間的。Oracle資料儲存同樣如此。

在進行儲存資料資訊的時候,Oracle將分配資料塊進行儲存,但是不能保證所有分配的資料塊都是連續的結構。所以,出現分割槽extent的概念,表示一系列連續的資料塊集合。

檢視dba_extents(或者all_extentsuser_extents)是我們研究分割槽結構和儲存構成的重要手段。

SQL> desc dba_extents;

NameTypeNullable Default Comments

--------------- ------------ -------- ------- ---------------------------------------------------------

OWNERVARCHAR2(30) YOwner of the segment associated with the extent

SEGMENT_NAMEVARCHAR2(81) YName of the segment associated with the extent

PARTITION_NAMEVARCHAR2(30) YPartition/Subpartition Name, if any, of the segment

SEGMENT_TYPEVARCHAR2(18) YType of the segment

TABLESPACE_NAME VARCHAR2(30) YName of the tablespace containing the extent

EXTENT_IDNUMBERYExtent number in the segment

FILE_IDNUMBER YName of the file containing the extent

BLOCK_IDNUMBERYStarting block number of the extent

BYTESNUMBERYSize of the extent in bytes

BLOCKSNUMBERYSize of the extent in ORACLE blocks

RELATIVE_FNONUMBERYRelative number of the file containing the segment header

從檢視中,我們可以清晰看出分割槽的幾個特點。

首先分割槽是帶有段特定性的。資料段segment是分割槽的上層組織單位,一個數據庫物件對應一個segement,資料庫物件是歸屬在不同的schemaowner)上的。所以,通過不同的資料段名稱、不同的owner,乃至不同的tablespace表空間資訊,就可以定位到資料區extent的資訊描述。

另一部分資訊是關於該區extent的分配資訊,如所在檔案編號,起始資料塊block編號和資料塊數量等內容。

資料段segment

資料段是與資料庫物件相對應,一般一個數據庫物件對應一個數據段。多個extent是對應一個數據段,每個資料段實際上就是資料庫一個物件的代表。從dba_segments檢視中,可以比較清楚看清資料段的結構。

SQL> desc dba_segments;

NameTypeNullable Default Comments

--------------- ------------ -------- -------

OWNERVARCHAR2(30) YUsername of the segment owner

SEGMENT_NAMEVARCHAR2(81) YName, if any, of the segment

PARTITION_NAMEVARCHAR2(30) YPartition/Subpartition Name, if any, of the segment

SEGMENT_TYPEVARCHAR2(18) YType of segment:"TABLE", "CLUSTER", "INDEX", "ROLLBACK",

"DEFERRED ROLLBACK", "TEMPORARY","SPACE HEADER", "TYPE2 UNDO" or "CACHE"

TABLESPACE_NAME VARCHAR2(30) YName of the tablespace containing the segment

HEADER_FILENUMBERY ID of the file containing the segment header

HEADER_BLOCKNUMBERY ID of the block containing the segment header

BYTESNUMBERY Size, in bytes, of the segment

BLOCKSNUMBERY Size, in Oracle blocks, of the segment

EXTENTSNUMBERY Number of extents allocated to the segment

INITIAL_EXTENTNUMBERYSize, in bytes, of the initial extent of the segment

NEXT_EXTENTNUMBERYSize, in bytes, of the next extent to be allocated to the segment

MIN_EXTENTSNUMBERY Minimum number of extents allowed in the segment

MAX_EXTENTSNUMBERY Maximum number of extents allowed in the segment

PCT_INCREASENUMBERY Percent by which to increase the size of the next extent to be allocated

FREELISTSNUMBERYNumber of process freelists allocated in this segment

FREELIST_GROUPS NUMBERYNumber of freelist groups allocated in this segment

RELATIVE_FNONUMBERYRelative number of the file containing the segment header

BUFFER_POOLVARCHAR2(7)YThe default buffer pool to be used for segments blocks

segment_type列的comment資訊中,可以看出資料段的型別是多樣的。任何種類的資料庫物件,本質上都是一種資料段。資料表、索引、回滾、聚集這些都是資料段的一種表現形式。同時,資料段是在資料物件建立的時候就已經創建出來,隨著物件體積的增大,而不斷分配多個extents進行管理。

另一部分資訊可以從dba_segments中讀出的,就是該資料物件分配的空間大小和資料塊、分割槽個數。使用這個檢視,可以方便的獲取到指定schema的所有物件大小。

SQL> select owner,sum(bytes)/1024/1024 as vol, sum(blocks) as totalblocks,sum(extents) as totalextents from dba_segments group by owner having wner='SYS';

OWNERVOL TOTALBLOCKS TOTALEXTENTS

------------------------------ ---------- ----------- ------------

SYS585.5749443248

上面查詢,說明SYSschema,所佔用空間585.5MB,包括74944個數據塊和3248個分割槽。

一個物件創建出來之後,在segment層次上是分配一個分割槽extent和八個資料塊block

有一個問題需要注意,通常我們的資料段是與資料物件相關。一個數據物件對應一個segment。但是,分割槽表的時候,一個分割槽要對應一個segment物件。還有就是,segment物件是可以指定儲存在那個表空間裡,實現儲存劃分的基礎也就在於此。不同型別的segment劃分建立在不同的表空間裡,才有可能存放在不同的檔案中,最後分佈在不同的物理儲存。

分割槽實際上就是存在分開儲存的可能。一般一個物件是不會跨物理儲存進行存放的,分割槽表是對應的多個segment。所以,分割槽表分開儲存空間是可能的。

表空間tablespace

TableSpace是儲存結構中的最高層結構。建立一個表空間的時候,是需要指定儲存的檔案。一個表空間可以指定多個數據檔案,多個檔案可以在不同的物理儲存上。也就是說,表空間是可以跨物理儲存的。但是有一點就是,表空間下一級物件資料段的儲存,是不能指定儲存在那個檔案裡的。所以,要想讓資料物件訪問IO負載均衡,需要指定不同的資料物件在不同的表空間裡。這也就是為什麼將資料表和索引建立在不同的表空間的原因。

表空間通過v$tablespace進行訪問。

SQL> desc v$tablespace;

NameTypeNullable Default Comments

--------------------------- ------------ -------- ------- --------

TS#NUMBERY

NAMEVARCHAR2(30) Y

INCLUDED_IN_DATABASE_BACKUP VARCHAR2(3)Y

BIGFILEVARCHAR2(3)Y

FLASHBACK_ONVARCHAR2(3)Y

ENCRYPT_IN_BACKUPVARCHAR2(3)Y

相對於前面的結構檢視,表空間檢視的結構要簡單的多,只是一些描述資訊。其中兩個引數需要注意一下。

一個是bigfile,是一個標誌位,標誌表空間是不是所謂的大檔案表空間。大檔案表空間是在10g中推出的一個新特性,處於效能考慮,可以設定表空間為大檔案表空間,儲存超過百T的資料,但是要求資料檔案只能有一個。另一個是flashback_on,表示表空間的閃回特性是否開啟。

要注意,資料表段區塊的概念集合,很容易與schema的結構相混淆。schema是一個組織概念,是來自於經典資料庫理論範疇。在oracle中,Schema就是一個組織概念,一個user對應的就是一個schemaschema是邏輯物件的集合組織,同表空間等概念不是一個層面的。

在一個schema裡,是可以將物件建立在任何資料表空間內的,只有一個預設表空間的概念default tablespace。指定預設表空間是在建立使用者的時候指定的。

分清幾個核心概念和各自的區別關係,就能更好的理解Oracle執行的各種機制。