1. 程式人生 > >Oracle儲存結構總結

Oracle儲存結構總結

      今天我們總結一下ORACLE的儲存結構,跟其他儲存一樣,ORACLE資料檔案也需要儲存在檔案中,但是為了方便管理,ORACLE為我們做了比較好理解的邏輯結構,通過邏輯結構來免除直接與底層的儲存直接接觸。ORACLE為我們提供了表空間,表空間是資料庫的邏輯組成部分。從物理上講,資料是存放在資料檔案中的,而從邏輯上講,資料是存放在表空間中的,一個表空間有若干個資料檔案組成。把oracle資料庫看作一個大樓(資料庫),表空間可以看作這個樓房的各個樓層(表空間),每個樓層又有單獨的房間(資料檔案),單獨的房間可以住人或者是儲物(表結構),表空間和資料檔案是可以自由分配的。使用者指定表空間也就是你希望把屬於這個使用者的表放在那個房間(表空間)裡面。
  資料庫的邏輯結構
      Oracle中的邏輯結構包括:表空間、段、區、塊。

  資料庫是由表空間構成,而表空間由段構成,段又由區構成,最後區又由Oracle塊構成。這樣分級是為了提高資料庫的效率。資料庫就好比一個國家,為了方便管理,我們將國家分為省,省又分為市,依次類推。Oracle也是如此,表空間的設計大大提高了資料庫的效率,表空間能:1)控制資料庫佔用的磁碟空間大小;2)dba可以將不同的資料型別部署到不同的位置,這樣有利於提高I/O效能,同時利於備份和恢復等操作。

資料段segment
資料段是與資料庫物件相對應,一般一個數據庫物件對應一個數據段。多個extent是對應一個數據段,每個資料段實際上就是資料庫一個物件的代表。從dba_segments檢視中,可以比較清楚看清資料段的結構從segment_type列的comment資訊中,可以看出資料段的型別是多樣的。任何種類的資料庫物件,本質上都是一種資料段。資料表、索引、回滾、聚集這些都是資料段的一種表現形式。同時,資料段是在資料物件建立的時候就已經創建出來,隨著物件體積的增大,而不斷分配多個extents進行管理。另一部分資訊可以從dba_segments中讀出的,就是該資料物件分配的空間大小和資料塊、分割槽個數。使用這個檢視,可以方便的獲取到指定schema的所有物件大小。一個物件創建出來之後,在segment層次上是分配一個分割槽extent和八個資料塊block。有一個問題需要注意,通常我們的資料段是與資料物件相關。一個數據物件對應一個segment。但是,分割槽表的時候,一個分割槽要對應一個segment物件。還有就是,segment物件是可以指定儲存在那個表空間裡,實現儲存劃分的基礎也就在於此。不同型別的segment劃分建立在不同的表空間裡,才有可能存放在不同的檔案中,最後分佈在不同的物理儲存。分割槽實際上就是存在分開儲存的可能。一般一個物件是不會跨物理儲存進行存放的,分割槽表是對應的多個segment。所以,分割槽表分開儲存空間是可能的。

區extent
區extent是比資料塊大一級的儲存結構,表示的是一連串連續的資料塊集合。我們知道,物理儲存通常是隨機的讀寫過程。即使在同一個檔案裡,我們也不能保證相同的一個資訊是儲存在絕對連續的物理儲存空間的。Oracle資料儲存同樣如此。
在進行儲存資料資訊的時候,Oracle將分配資料塊進行儲存,但是不能保證所有分配的資料塊都是連續的結構。所以,出現分割槽extent的概念,表示一系列連續的資料塊集合。

資料塊(Block)
資料塊Block是Oracle儲存資料資訊的最小單位。注意,這裡說的是Oracle環境下的最小單位。Oracle也就是通過資料塊來遮蔽不同作業系統儲存結構的差異。無論是Windows環境,還是Unix/Linux環境,他們的作業系統儲存結構和方式、甚至字元排列的方式都是不同的。Oracle利用資料塊將這些差異加以遮蔽,全部資料操作採用對Oracle塊的操作,相當於是一個層次的抽象。
Oracle所有對資料的操作和空間分配,實際上都是針對資料塊Block的操作。我們從資料表中搜索出一行,實際中Oracle就會從記憶體緩衝區(或者硬碟)中讀取到該行所在的資料塊,再返回這資料塊上的指定資料行。Oracle無論是在緩衝區,還是在硬碟,進行資料操作的雖小單位也就是資料塊。資料塊是有大小的,在一個數據庫建立的時候,通過引數進行設定。注意,在Oracle資料庫引數中,只有資料塊大小的引數是建庫之後不能進行修改的。資料塊的大小,在一個數據庫中可以支援多個,但是一般沒有太大的意義,會給管理和除錯帶來一定的負擔。資料塊的大小是通過kb位元組個數來指定的,預設為8KB。相關引數為db_block_size,下面是檢視block大小的語句。