官术网_书友最值得收藏!

2.2 邏輯存儲結(jié)構(gòu)

邏輯存儲結(jié)構(gòu)是Oracle數(shù)據(jù)庫存儲結(jié)構(gòu)的核心內(nèi)容,對Oracle數(shù)據(jù)庫的所有操作都會涉及其邏輯存儲結(jié)構(gòu)。邏輯存儲結(jié)構(gòu)是從邏輯的角度分析數(shù)據(jù)庫的構(gòu)成,是對數(shù)據(jù)存儲結(jié)構(gòu)在邏輯概念上的劃分。Oracle的邏輯存儲結(jié)構(gòu)是一種層次結(jié)構(gòu),主要由表空間、段、數(shù)據(jù)區(qū)和數(shù)據(jù)塊等概念組成。邏輯結(jié)構(gòu)是面向用戶的,當(dāng)用戶使用Oracle設(shè)計數(shù)據(jù)庫時,其使用的就是邏輯存儲結(jié)構(gòu)。Oracle的邏輯存儲結(jié)構(gòu)中所包含的多個結(jié)構(gòu)對象從數(shù)據(jù)塊到表空間形成了不同層次的粒度關(guān)系,如圖2.2所示。

從圖2.2中可以看到,Oracle數(shù)據(jù)庫是由多個表空間組成(可見數(shù)據(jù)庫自身也屬于邏輯概念),而表空間又是由多個段組成,段由多個數(shù)據(jù)區(qū)組成,數(shù)據(jù)區(qū)又是由多個數(shù)據(jù)塊組成。

圖2.2 Oracle的邏輯存儲結(jié)構(gòu)

2.2.1 數(shù)據(jù)塊

數(shù)據(jù)塊(data block)是Oracle邏輯存儲結(jié)構(gòu)中最小的邏輯單位,也是執(zhí)行數(shù)據(jù)庫輸入/輸出操作的最小存儲單位。Oracle數(shù)據(jù)存放在Oracle數(shù)據(jù)塊中,而不是操作系統(tǒng)塊中。Oracle數(shù)據(jù)塊通常是操作系統(tǒng)塊的整數(shù)倍,如果操作系統(tǒng)塊的大小為2048 B,并且Oracle數(shù)據(jù)塊的大小為8192 B,則表示Oracle數(shù)據(jù)塊由4個操作系統(tǒng)塊構(gòu)成。Oracle數(shù)據(jù)塊有一定的標(biāo)準(zhǔn)大小,其大小被寫入初始化參數(shù)DB_BLOCK_SIZE中。另外,Oracle支持在同一個數(shù)據(jù)庫中使用多種大小不同的塊,與標(biāo)準(zhǔn)塊大小不同的塊就是非標(biāo)準(zhǔn)塊。

【例2.1】通過v$parameter數(shù)據(jù)字典查詢Oracle標(biāo)準(zhǔn)數(shù)據(jù)塊的大小,具體代碼如下。(實例位置:資源包\TM\sl\2\1)

     SQL> col name format a30
     SQL> col value format a20
     SQL> select name,value from v$parameter where name = 'db_block_size' ;

本例運行結(jié)果如圖2.3所示。首先格式化name列和value列的大小,以方便在同一行顯示,然后使用SELECT語句獲得參數(shù)DB_BLOCK_SIZE的值(即value列的值),該值也就是標(biāo)準(zhǔn)數(shù)據(jù)塊的大小。

數(shù)據(jù)塊中可以存放表數(shù)據(jù)、索引數(shù)據(jù)和簇數(shù)據(jù)等,無論存放哪種類型的數(shù)據(jù),其結(jié)構(gòu)都是相同的。數(shù)據(jù)塊由塊頭、表目錄、行目錄、空余空間和行數(shù)據(jù)這5部分組成,如圖2.4所示。

圖2.3 Oracle標(biāo)準(zhǔn)數(shù)據(jù)塊的大小

圖2.4 數(shù)據(jù)塊的結(jié)構(gòu)

 塊頭:存放數(shù)據(jù)塊的基本信息,如塊的物理地址、塊所屬的段的類型。

 表目錄:存放表的相關(guān)信息。如果數(shù)據(jù)塊中存儲的數(shù)據(jù)是表數(shù)據(jù),則表目錄中存儲有關(guān)這些表的相關(guān)信息。

 行目錄:如果塊中有行數(shù)據(jù)存在,則這些行的信息將被記錄在行目錄中。這些信息包括行地址等。

 空余空間:塊中未使用的區(qū)域,用于新行的插入和已經(jīng)存在的行的更新。

 行數(shù)據(jù):用于存放表數(shù)據(jù)和索引數(shù)據(jù)的地方,這部分空間已被數(shù)據(jù)行所占用(如表中的若干行數(shù)據(jù)記錄)。

通常把塊頭、表目錄、行目錄這3部分組合起來稱為頭部信息區(qū)。頭部信息區(qū)中不存放數(shù)據(jù),而是存放整個塊的引導(dǎo)信息,起到引導(dǎo)系統(tǒng)讀取數(shù)據(jù)的作用。頭部信息區(qū)若遭到破壞,則Oracle系統(tǒng)將無法讀取這部分?jǐn)?shù)據(jù)。另外,空余空間和行數(shù)據(jù)共同構(gòu)成塊的存儲區(qū),用于存放真正的數(shù)據(jù)記錄。

2.2.2 數(shù)據(jù)區(qū)

數(shù)據(jù)區(qū)(extent也可稱作數(shù)據(jù)擴展區(qū))是由一組連續(xù)的Oracle數(shù)據(jù)塊構(gòu)成的Oracle存儲結(jié)構(gòu),一個或多個數(shù)據(jù)塊組成一個數(shù)據(jù)區(qū),一個或多個數(shù)據(jù)區(qū)再組成一個段(segment)。當(dāng)一個段中的所有空間被使用完后,Oracle系統(tǒng)將自動為該段分配一個新的數(shù)據(jù)區(qū),這也正符合extent這個單詞所具有的“擴展”的含義,可見數(shù)據(jù)區(qū)是Oracle存儲分配的最小單位,Oracle就以數(shù)據(jù)區(qū)為單位進(jìn)行存儲控件的擴展。

使用數(shù)據(jù)區(qū)的目的是用來保存特定數(shù)據(jù)類型的數(shù)據(jù),也是表中數(shù)據(jù)增長的基本單位。在Oracle數(shù)據(jù)庫中,分配存儲空間就是以數(shù)據(jù)區(qū)為單位的。一個Oracle對象至少包含一個數(shù)據(jù)區(qū)。設(shè)置一張表或索引的存儲參數(shù)包含設(shè)置它的數(shù)據(jù)區(qū)大小。

2.2.3 段

段(segment)是由一個或多個數(shù)據(jù)區(qū)構(gòu)成的,它不是存儲空間的分配單位,而是一個獨立的邏輯存儲結(jié)構(gòu),用于存儲表、索引或簇等占用空間的數(shù)據(jù)對象,Oracle也把這種占用空間的數(shù)據(jù)對象統(tǒng)一稱為段。一個段只屬于一個特定的數(shù)據(jù)對象,每當(dāng)創(chuàng)建一個具有獨立段的數(shù)據(jù)對象時,Oracle就將為它創(chuàng)建一個段。

段是為特定的數(shù)據(jù)對象(如表、索引、回滾等)分配的一系列數(shù)據(jù)區(qū)。段內(nèi)包含的數(shù)據(jù)區(qū)可以不連續(xù),并且可以跨越多個文件,使用段的目的是用來保存特定對象。一個Oracle數(shù)據(jù)庫中通常包含以下4種類型的段。

(1)數(shù)據(jù)段。數(shù)據(jù)段中保存的是表中的數(shù)據(jù)記錄。在創(chuàng)建數(shù)據(jù)表時,Oracle系統(tǒng)將為表創(chuàng)建數(shù)據(jù)段。當(dāng)表中的數(shù)據(jù)量增大時,數(shù)據(jù)段的大小自然也隨著變大,數(shù)據(jù)段的增大過程是通過向其添加新的數(shù)據(jù)區(qū)來實現(xiàn)的。當(dāng)創(chuàng)建一張表時,系統(tǒng)自動創(chuàng)建一個以該表的名字命名的數(shù)據(jù)段。

(2)索引段。索引段中包含了用于提高系統(tǒng)性能的索引。一旦建立了索引,系統(tǒng)就會自動創(chuàng)建一個以該索引的名字命名的索引段。

(3)回滾段?;貪L段(也可稱作撤銷段)中保存了回滾條目,Oracle將修改前的舊值保存在回滾條目中。利用這些信息,可以撤銷未提交的操作,以便為數(shù)據(jù)庫提供讀入一致性和回滾未提交的事務(wù),即用來回滾事務(wù)的數(shù)據(jù)空間。當(dāng)一個事務(wù)開始處理時,系統(tǒng)為之分配回滾段,回滾段可以動態(tài)創(chuàng)建和撤銷。Oracle系統(tǒng)有個默認(rèn)的回滾段,其管理方式既可以是自動的,也可以是手動的。

(4)臨時段。當(dāng)執(zhí)行創(chuàng)建索引、查詢等操作時,Oracle可能會使用一些臨時存儲空間,用于暫時性地保存解析過的查詢語句以及在排序過程中產(chǎn)生的臨時數(shù)據(jù)。Oracle系統(tǒng)將在專門用于存儲臨時數(shù)據(jù)的表空間中為操作分配臨時段。

在執(zhí)行CREATE INDEX、SELECT ORDER BY、SELECT DISTINCT和SELECT GROUP BY等幾種類型的SQL語句時,Oracle系統(tǒng)就會在臨時表空間中為這些語句的操作分配一個臨時段。

在數(shù)據(jù)庫管理過程中,若經(jīng)常需要執(zhí)行上述這類SQL語句,最好調(diào)整SORT_AREA_SIZE初始化參數(shù)來增大排序區(qū),從而使排序操作盡量能夠在內(nèi)存中完成,以獲得更好的執(zhí)行效率,但同時這對數(shù)據(jù)庫服務(wù)器的內(nèi)存空間提出了更大的要求。

2.2.4 表空間

Oracle使用表空間(tablespace)將相關(guān)的邏輯結(jié)構(gòu)(如段、數(shù)據(jù)區(qū)等)組合在一起,表空間是數(shù)據(jù)庫的最大邏輯劃分區(qū)域,通常用來存放數(shù)據(jù)表、索引、回滾段(即segment)等數(shù)據(jù)對象,任何數(shù)據(jù)對象在創(chuàng)建時都必須被指定存儲在某個表空間中。表空間(屬邏輯存儲結(jié)構(gòu))與數(shù)據(jù)文件(屬物理存儲結(jié)構(gòu))相對應(yīng),一個表空間由一個或多個數(shù)據(jù)文件組成,一個數(shù)據(jù)文件只屬于一個表空間;Oracle數(shù)據(jù)的存儲空間在邏輯上表現(xiàn)為表空間,而在物理上表現(xiàn)為數(shù)據(jù)文件。舉個例子來說,表空間相當(dāng)于操作系統(tǒng)中的文件夾,而數(shù)據(jù)文件就相當(dāng)于文件夾中的文件。每個數(shù)據(jù)庫至少有一個表空間(即SYSTEM表空間),表空間的大小等于所有從屬于它的數(shù)據(jù)文件大小的總和。

由于表空間在物理上(即磁盤上)包含操作系統(tǒng)中的一個或多個數(shù)據(jù)文件,因此在表空間中創(chuàng)建的數(shù)據(jù)對象存在以下兩種情況。

(1)若表空間只包含一個數(shù)據(jù)文件,則該表空間中的所有對象都存儲在這個數(shù)據(jù)文件中。

(2)若表空間包含多個數(shù)據(jù)文件,則Oracle即可將數(shù)據(jù)對象存儲在該表空間的任意一個數(shù)據(jù)文件中,也可以將同一個數(shù)據(jù)對象中的數(shù)據(jù)分布在表空間的多個數(shù)據(jù)文件中。

在創(chuàng)建數(shù)據(jù)庫時,Oracle系統(tǒng)會自動創(chuàng)建多個默認(rèn)的表空間,這些表空間除了用于管理用戶數(shù)據(jù)的表空間,還包括用于管理Oracle系統(tǒng)內(nèi)部數(shù)據(jù)(如數(shù)據(jù)字典)的表空間。下面列舉一些Oracle默認(rèn)創(chuàng)建的主要表空間。

(1)SYSTEM表空間—系統(tǒng)表空間。它用于存放Oracle系統(tǒng)內(nèi)部表和數(shù)據(jù)字典的數(shù)據(jù),如表名、列名、用戶名等。Oracle本身不贊成將用戶創(chuàng)建的表、索引等存放在系統(tǒng)表空間中。表空間中的數(shù)據(jù)文件個數(shù)不是固定不變的,可以根據(jù)需要向表空間追加新的數(shù)據(jù)文件。

【例2.2】通過dict查看數(shù)據(jù)庫中數(shù)據(jù)字典的信息,具體代碼如下。

     SQL> col table_name for a30
     SQL> col comments for a30
     SQL> select * from dict;

【例2.3】通過v$fixed_view_definition查看數(shù)據(jù)庫中內(nèi)部系統(tǒng)表的信息,具體代碼如下。

     SQL> col view_name format a30
     SQL> col view_definition format a30
     SQL> select * from v$fixed_view_definition;

(2)SYSAUX表空間。它是Oracle新增加的表空間,是隨著數(shù)據(jù)庫的創(chuàng)建而創(chuàng)建的,它充當(dāng)SYSTEM的輔助表空間,降低了SYSTEM表空間的負(fù)荷,主要存儲除數(shù)據(jù)字典以外的其他數(shù)據(jù)對象。SYSAUX表空間一般不存儲用戶的數(shù)據(jù),由Oracle系統(tǒng)內(nèi)部自動維護(hù)。

(3)UODO表空間—撤銷表空間。它用于存儲撤銷信息的表空間。當(dāng)用戶對數(shù)據(jù)表進(jìn)行修改操作(包括插入、更新、刪除等操作)時,Oracle系統(tǒng)自動使用撤銷表空間來臨時存儲修改前的舊數(shù)據(jù)。在所做的修改操作完成并執(zhí)行提交命令后,Oracle根據(jù)系統(tǒng)設(shè)置的保留時間長度來決定何時釋放掉撤銷表空間的部分空間。一般在創(chuàng)建Oracle實例后,Oracle系統(tǒng)自動創(chuàng)建一個名稱為UNDOTBS1的撤銷表空間,該撤銷表空間對應(yīng)的數(shù)據(jù)文件是UNDOTBS01.DBF。

(4)USERS表空間—用戶表空間。它是Oracle建議用戶使用的表空間,可以在這個表空間上創(chuàng)建各種數(shù)據(jù)對象。例如,創(chuàng)建表、索引、用戶等數(shù)據(jù)對象。Oracle系統(tǒng)的樣例用戶scott對象就存儲在USERS表空間中。

除了Oracle系統(tǒng)默認(rèn)創(chuàng)建的表空間,用戶可根據(jù)應(yīng)用系統(tǒng)的實際情況及其所要存儲的對象類型創(chuàng)建多個自定義的表空間,以區(qū)分用戶數(shù)據(jù)與系統(tǒng)數(shù)據(jù)。此外,不同應(yīng)用系統(tǒng)的數(shù)據(jù)應(yīng)存儲在不同的表空間上,而不同表空間的文件應(yīng)存儲在不同的磁盤上,以減少I/O沖突,進(jìn)而提高應(yīng)用系統(tǒng)的操作性能。

主站蜘蛛池模板: 望城县| 镇赉县| 邢台市| 丹寨县| 山阳县| 梁山县| 石狮市| 罗定市| 余干县| 墨竹工卡县| 库尔勒市| 乌兰县| 济南市| 出国| 万安县| 高平市| 田阳县| 莱西市| 体育| 南京市| 上杭县| 资源县| 库车县| 忻州市| 甘孜县| 姚安县| 大方县| 临桂县| 桃江县| 莱阳市| 兴城市| 紫阳县| 家居| 大渡口区| 新津县| 马鞍山市| 固镇县| 白沙| 建瓯市| 逊克县| 基隆市|