數據塊(Block)
數據塊Block是Oracle存儲數據信息的最小單位。注意,這里說的是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_extents、user_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,數據庫對象是歸屬在不同的schema(owner)上的。所以,通過不同的數據段名稱、不同的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
上面查詢,說明SYS的schema,所占用空間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對應的就是一個schema。schema是邏輯對象的集合組織,同表空間等概念不是一個層面的。
在一個schema里,是可以將對象建立在任何數據表空間內的,只有一個默認表空間的概念default tablespace。指定默認表空間是在創建用戶的時候指定的。
表空間是數據庫的邏輯組成部分
從物理上將:數據庫數據存放在數據文件中
從邏輯上將:數據庫則是存放在表空間中
表空間由一個或是多個數據文件組成
數據文件和日志文件是數據庫中最重要的文件。它們是數據存儲的地方。
每個數據庫至少有一個與之相關的數據文件,通常情況下不只一個,有很多。
表空間(tablespace)、段(segment)、區(extent)、塊(block),這些都是oracle數據庫在數據文件中組織數據的基本單元。
塊是數據存儲的物理單位,也是數據文件中最基礎的單位,數據直接存儲在塊上。
是oracle空間分配的最小單位。oracle中的塊大小常見的有三種,2KB、4KB、8KB。
塊的大小在數據庫創建時就已經固定下來,數據庫中每個塊的大小都是相同的,
而且所有的塊都有相同的格式,由“塊頭+表目錄+行目錄+空閑空間+數據空間”組成。
塊頭包含着塊類型(比如是表塊、還是索引塊)的信息、磁盤上塊的位置等信息。
表目錄(table directory),如果有的話,包含着此塊中存儲各行的表的信息(如果一個塊中存有多個表中的數據)。
行目錄(row directory)包含着數據行的描述信息,它是一個指針數組,指示了每一行在數據塊中的物理位置。
塊頭、表目錄、行目錄統稱為塊開銷(block overhead),是oracle原來統計、管理塊本身的。
剩下的兩部分很簡單,已經存有數據的就是數據空間,暫時沒存的就是空閑空間。
區又叫盤區,是數據文件中一個連續的分配空間,它比塊要大,由塊組成。有些對象分配空間時可能至少需要兩個盤區,比如回滾段,
而這兩個盤區不一定要求相連。區的大小從一個塊到2GB不等
段是oracle數據庫中的分配單位,對象如表、索引等都是以段為單位進行分配。當創建一個表時將創建一個表段,創建一個索引時就創建一個索引段。
每一個消耗存儲空間的對象最終被存儲到一個單一的段中。有回滾段、臨時段、聚簇段、索引段等。
表空間是一個邏輯容器,它和數據文件關聯起來,一個表空間至少有一個數據文件與之關聯。一個表空間可以有多個段,一個段只能屬於一個表空間。
方案(schema)又叫模式,是比表空間小一級的邏輯概念,它也是一個邏輯容器。多個用戶可能共用一個表空間,
那如何區分開每一個用戶?那么在表空間中對每個用戶都有一個對應的方案,用於保存單個用戶的信息。
oracle中存儲的層次結構總結如下:
一、數據庫由一個或多個表空間組成
二、表空間由一個或多個數據文件組成,一個表空間包含多個段
三、段由一個或多個區組成
四、區是數據文件中一個連續的分配空間,由一個或多個塊組成
五、塊是數據庫中最小、最基本的單位,是數據庫使用的最小的I/O單元
六、每個用戶都有一個對應的方案
SGA:System Global Area是Oracle Instance的基本組成部分,在實例啟動時分配;系統全局域SGA主要由三部分構成:共享池、數據緩沖區、日志緩沖區。
PGA:Process Global Area是為每個連接到Oracle database的用戶進程保留的內存。是每個連接私有的。並不屬於數據庫實例