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

liuhaimiao發表於2014-08-12

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;

 

NAME                                 TYPE        VALUE

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

db_block_size                        integer     8192  //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;

Name            Type         Nullable Default Comments                                                 

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

OWNER           VARCHAR2(30) Y         Owner of the segment associated with the extent          

SEGMENT_NAME    VARCHAR2(81) Y         Name of the segment associated with the extent           

PARTITION_NAME  VARCHAR2(30) Y         Partition/Subpartition Name, if any, of the segment      

SEGMENT_TYPE    VARCHAR2(18) Y         Type of the segment                                       

TABLESPACE_NAME VARCHAR2(30) Y         Name of the tablespace containing the extent             

EXTENT_ID       NUMBER       Y         Extent number in the segment                             

FILE_ID         NUMBER       Y         Name of the file containing the extent                   

BLOCK_ID        NUMBER       Y         Starting block number of the extent                      

BYTES           NUMBER       Y         Size of the extent in bytes                               

BLOCKS          NUMBER       Y         Size of the extent in ORACLE blocks                      

RELATIVE_FNO    NUMBER       Y         Relative number of the file containing the segment header

 

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

 

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

 

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

 

 

資料段segment

 

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

SQL> desc dba_segments;

Name            Type         Nullable Default Comments                                                                                                                              

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

OWNER           VARCHAR2(30) Y                Username of the segment owner                                                                                                         

SEGMENT_NAME    VARCHAR2(81) Y                Name, if any, of the segment                                                                                                          

PARTITION_NAME  VARCHAR2(30) Y         Partition/Subpartition Name, if any, of the segment                                                                                    

SEGMENT_TYPE    VARCHAR2(18) Y     Type of segment:  "TABLE", "CLUSTER", "INDEX", "ROLLBACK",

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

TABLESPACE_NAME VARCHAR2(30) Y                Name of the tablespace containing the segment                                                                                         

HEADER_FILE     NUMBER       Y                ID of the file containing the segment header                                                                                           

HEADER_BLOCK    NUMBER       Y                ID of the block containing the segment header                                                                                          

BYTES           NUMBER       Y                Size, in bytes, of the segment                                                                                                        

BLOCKS          NUMBER       Y                Size, in Oracle blocks, of the segment                                                                                                

EXTENTS         NUMBER       Y                Number of extents allocated to the segment                                                                                             

INITIAL_EXTENT  NUMBER       Y         Size, in bytes, of the initial extent of the segment                                                                                  

NEXT_EXTENT     NUMBER       Y   Size, in bytes, of the next extent to be allocated to the segment                                                                     

MIN_EXTENTS     NUMBER       Y                Minimum number of extents allowed in the segment                                                                                       

MAX_EXTENTS     NUMBER       Y                Maximum number of extents allowed in the segment                                                                                      

PCT_INCREASE    NUMBER       Y   Percent by which to increase the size of the next extent to be allocated                                                              

FREELISTS       NUMBER       Y   Number of process freelists allocated in this segment                                                                                  

FREELIST_GROUPS NUMBER       Y   Number of freelist groups allocated in this segment                                                                                   

RELATIVE_FNO    NUMBER       Y      Relative number of the file containing the segment header                                                                             

BUFFER_POOL     VARCHAR2(7)  Y      The 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';

 

OWNER             VOL TOTALBLOCKS TOTALEXTENTS

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

SYS                 585.5       74944         3248

 

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

 

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

 

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

 

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

 

 

表空間tablespace

 

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

 

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

 

SQL> desc v$tablespace;

Name                        Type         Nullable Default Comments

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

TS#                         NUMBER       Y                        

NAME                        VARCHAR2(30) Y                        

INCLUDED_IN_DATABASE_BACKUP VARCHAR2(3)  Y                        

BIGFILE                     VARCHAR2(3)  Y                        

FLASHBACK_ON                VARCHAR2(3)  Y                        

ENCRYPT_IN_BACKUP           VARCHAR2(3)  Y                         

 

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

 

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

 

 

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

 

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

 

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

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/223653/viewspace-1249718/,如需轉載,請註明出處,否則將追究法律責任。

相關文章