【DB筆試面試524】在Oracle中,邏輯結構由哪幾個部分組成?

  • 2019 年 10 月 10 日
  • 筆記

題目部分

在Oracle中,邏輯結構由哪幾個部分組成?

答案部分

Oracle中邏輯結構包括表空間(TABLESPACE)、段(SEGMENT)、區(EXTENT)和塊(BLOCK)。資料庫由表空間構成,而表空間又是由段構成,而段又是由區構成,而區又是由Oracle塊構成,即塊→區→段→表空間→資料庫。

邏輯結構圖簡單如下圖所示:

圖 3-4 Oracle邏輯結構圖

Oracle資料庫在邏輯上將數據存儲在表空間中,在物理上將數據存儲在數據文件中。

① 資料庫(Database):一個資料庫是由多個表空間組成,也可以說多個不同類型的表空間組成了一個資料庫。

② 表空間(Tablespace):資料庫中的基本邏輯結構,一系列數據文件的集合。一個表空間可以包括多個數據文件,這多個數據文件可以分布在不同的磁碟上,這樣可以提高表空間的I/O請求。資料庫的數據作為一個整體存儲在構成資料庫每一個表空間的數據文件中。一個Oracle資料庫必須至少有兩個表空間(必需的SYSTEM和SYSAUX表空間),每個表空間包含一個或多個數據文件。臨時文件是一個屬於臨時表空間的文件,它是使用TEMPFILE選項創建的。臨時表空間不能包含永久資料庫對象(例如表),並且通常用於排序。表空間可以分為大文件表空間和小文件表空間,參考【真題154、什麼是大文件表空間(BIGFILE TABLESPACE)?】。

③ 段(Segment):對象在資料庫中佔用的空間。當在資料庫中創建表或索引時,系統就會創建對應的段。段是由多個可以不連續的區組成,所以段是可以跨數據文件的。當段空間不足時,系統將以區為單位為段分配空間。段按照類型可以分為數據段、索引段、Undo段、臨時段等,其中:

l 數據段:每個非集群的、不按索引組織的表都有一個數據段,但外部表、全局臨時表和分區表除外,這些表中的每個表都有一個或多個段。表中的所有數據都存儲在相應數據段的區中。對於分區表,每個分區都有一個數據段。每個集群也都有一個數據段。集群中每個表的數據都存儲在集群的數據段中。

l 索引段:每個索引都有一個索引段,存儲其所有數據。對於分區索引,每個分區都有一個索引段。

l Undo段:Oracle為每個資料庫實例創建一個Undo表空間,該表空間包含大量用於臨時存儲還原資訊的Undo段。Undo段中的資訊用於生成讀一致性資料庫資訊,並且在資料庫恢復過程中,用於為用戶回滾未提交的事務處理。

l 臨時段:臨時段是在需要臨時工作區來執行SQL語句時,由Oracle資料庫創建的。在語句執行完成後,臨時段的區將返回到實例以備將來使用。Oracle會為每個用戶指定一個默認臨時表空間,或指定一個在資料庫範圍內使用的默認臨時表空間。

④ 區(Extent):為數據一次性預留的一個較大的存儲空間。區是一個空間分配單位,當資料庫對象空間不足時,通常會以區為單位進行分配空間。區是由多個連續的數據塊組成,由此可知區是不能跨數據文件的。

⑤ 塊(Block):Oracle最基本的存儲單位,在建立資料庫的時候指定DB_BLOCK_SIZE值,該參數表示資料庫標準數據塊的大小,默認大小為8K,它是資料庫一次標準I/O的大小,一個標準的Oracle數據塊是由連續的作業系統數據塊組成的。1個8K的數據塊理論上最多可存儲700多行,所以,塊越大,在相同情況下存儲的行就越多,而Oracle是以塊為單位進行訪問的,那麼產生的邏輯讀就越小。需要注意的是,塊越大,不同的會話訪問不同的數據落在同一個塊的幾率就增加了,這就容易產生熱點塊競爭,所以,在OLAP中,可以適當將塊調大。

真題1、Note the following structures in your database server:

1、Extents

2、OS Blocks

3、Tablespace

4、Segments

5、Oracle Data Block

Which option has the correct arrangement of these structures FROM the smallest to the largest?()

A、2,5,1,4,3

B、1,2,3,4,5

C、5,2,1,3,4

D、2,1,5,4,3

答案:A。

Oracle中邏輯結構包括表空間、段、區和塊。說明一下:資料庫由表空間構成,而表空間又是由段構成,而段又是由區構成,而區又是由Oracle 塊構成的這樣的一種結構,可以提高資料庫的效率,塊 → 區 → 段 → 表空間 → 資料庫。題目問的是從小到大的排序哪個是正確的。

本題中,對於選項A,OS BLOCKS->ORACLE DATA BLOCK->EXTENTS->SEGMENTS->TABLESPACE,排序正確。所以,選項A正確。

對於選項B,Extents不是最小的,排除掉。所以,選項B錯誤。

對於選項C,Oracle數據塊也不是最小的,排除掉。所以,選項C錯誤。

對於選項D,塊組成區,而不是區組成塊。所以,選項D錯誤。

所以,本題的答案為A。

真題2、下面有關TABLESPACE和DATAFILE之間的關係的描述中,說法錯誤的是()

A、一個TABLESPACE可以有一個或多個DATAFILE

B、每個DATAFILE只能在一個TABLESPACE內

C、TABLE中的數據,通過HASH演算法分布在TABLESPACE中的各個DATAFILE中

D、DATAFILE是邏輯上的概念,TABLESPACE則在物理上儲存了資料庫的種種對象

答案:D。

關於資料庫的邏輯結構和物理結構,表空間(TABLESPACE)是邏輯上的概念,數據文件(DATAFILE)是物理上的概念。一個表空間可以由一個或多個數據文件組成,一個數據文件不能跨越多個表空間。TABLE中的數據,通過HASH演算法分布在表空間中的各個數據文件中。表空間是Oracle資料庫中最大的邏輯單位與存儲空間單位,資料庫系統通過表空間為資料庫對象分配空間。

本題中,對於選項A,一個TABLESPACE可以有一個或多個DATAFILE,說法是正確的。所以,選項A錯誤。

對於選項B,每個DATAFILE只能在一個TABLESPACE內,說法正確。所以,選項B錯誤。

對於選項C,TABLE中的數據,通過HASH演算法分布在TABLESPACE中的各個DATAFILE中,說法正確。所以,選項C錯誤。

對於選項D,TABLESPACE是邏輯上的概念,DATAFILE是物理上的概念,選項中正好說反了。所以,選項D正確。

所以,本題的答案為D。

真題3、DATA BLOCK,EXTENT和SEGMENT的區別是什麼?

答案:DATA BLOCK是資料庫中最小的邏輯存儲單元。當資料庫的對象需要更多的物理存儲空間時,連續的DATA BLOCK就組成了EXTENT。一個資料庫對象擁有的所有EXTENT被稱為該對象的SEGMENT。

真題4、在Oracle中,數據塊、Redo日誌塊及控制文件數據塊的大小分別是多少?如何查詢?

答案:這3種數據塊分別介紹如下:

① 數據塊(Data Block),是讀寫數據文件的最小單位,默認是8KB,可以通過SQL語句「SELECT FILE#,NAME,BLOCK_SIZE FROM V$DATAFILE;」查詢,單位為BYTE。

② Redo日誌數據塊(Redo Log Block),大小一般等於作業系統的系統塊的大小,一般為512或4096,可以通過SQL語句「SELECT BLOCKSIZE FROM V$LOG;」或「SELECT LEBSZ FROM X$KCCLE;」查詢,單位為BYTE。

③ 控制文件數據塊(Control File Block),默認為16KB,可以通過SQL語句「SELECT BLOCK_SIZE FROM V$CONTROLFILE;」查詢,單位為BYTE。

SQL> col name for a50

SQL> select file#,name,block_size from v$datafile;

FILE# NAME BLOCK_SIZE

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

1 /u02/app/oracle/oradata/oratest/system01.dbf 8192

2 /u02/app/oracle/oradata/oratest/sysaux01.dbf 8192

3 /u02/app/oracle/oradata/oratest/undotbs01.dbf 8192

4 /u02/app/oracle/oradata/oratest/users01.dbf 8192

5 /u02/app/oracle/oradata/oratest/example01.dbf 8192

6 /u02/app/oracle/oradata/oratest/users02.dbf 8192

7 /u02/app/oracle/oradata/oratest/ts_ogg01.dbf 8192

8 /u02/app/oracle/oradata/oratest/users03.dbf 8192

8 rows selected.

SQL> select lebsz from x$kccle;

LEBSZ

----------

512

512

512

SQL> select block_size from v$controlfile;

BLOCK_SIZE

----------

16384

16384

& 說明:

有關OS數據塊的查詢更多內容可以參考:http://blog.itpub.net/26736162/viewspace-2136094/、http://blog.itpub.net/26736162/viewspace-2136095/。

本文選自《Oracle程式設計師面試筆試寶典》,作者:李華榮。