- Oracle從新手到高手
- 楊繼萍
- 3810字
- 2019-12-09 14:48:59
2.2 邏輯存儲(chǔ)結(jié)構(gòu)
數(shù)據(jù)庫(kù)的邏輯結(jié)構(gòu)是從邏輯的角度分析數(shù)據(jù)庫(kù)的構(gòu)成,即創(chuàng)建數(shù)據(jù)庫(kù)后形成的邏輯概念之間的關(guān)系。在邏輯上,Oracle將保存的數(shù)據(jù)劃分為一個(gè)個(gè)小單元來(lái)存儲(chǔ)和維護(hù),高一級(jí)的存儲(chǔ)單元由一個(gè)或多個(gè)低一級(jí)的存儲(chǔ)單元組成。Oracle的邏輯存儲(chǔ)單元從小到大依次為:數(shù)據(jù)塊(DATA BLOCKS)、盤(pán)區(qū)(EXTENT)、段(SEGMENTS)和表空間(TABLE SPACES),下圖顯示了各邏輯單位之間的關(guān)系。

由上圖可知,Oracle數(shù)據(jù)庫(kù)由多個(gè)表空間組成,而表空間又由許多段組成,段由多個(gè)盤(pán)區(qū)組成,盤(pán)區(qū)又由多個(gè)數(shù)據(jù)塊組成。
2.2.1 數(shù)據(jù)塊
數(shù)據(jù)塊是Oracle用來(lái)管理存儲(chǔ)空間的最小單元,也是執(zhí)行數(shù)據(jù)庫(kù)輸入輸出操作時(shí)的最小單位。相應(yīng)地,操作系統(tǒng)執(zhí)行輸入輸出操作的最小單位為一個(gè)操作系統(tǒng)塊的大小。在操作系統(tǒng)中,執(zhí)行I/O操作是以操作系統(tǒng)塊為單位的,而在Oracle中,執(zhí)行的I/O操作以O(shè)racle數(shù)據(jù)塊為單位。
Oracle塊的大小是操作系統(tǒng)塊大小的整數(shù)倍。以Windows NT操作系統(tǒng)為例,NTFS格式的磁盤(pán)分區(qū)一般為4KB,因此Oracle塊的大小為8KB等。數(shù)據(jù)塊的標(biāo)準(zhǔn)大小由初始化參數(shù)DB_ BLOCK_SIZE確定,具有標(biāo)準(zhǔn)大小的塊稱為標(biāo)準(zhǔn)塊。Oracle支持在同一個(gè)數(shù)據(jù)庫(kù)中使用多種大小的塊,與標(biāo)準(zhǔn)塊大小不同的塊稱為非標(biāo)準(zhǔn)塊。
可以通過(guò)查詢V$PARAMETER數(shù)據(jù)字典,獲得參數(shù)DB_BLACK_SIZE的值,該參數(shù)值同時(shí)也是數(shù)據(jù)塊的尺寸,例如:

在數(shù)據(jù)塊中可以存儲(chǔ)各種類型的數(shù)據(jù),如表數(shù)據(jù)、索引數(shù)據(jù)、簇?cái)?shù)據(jù)等。無(wú)論數(shù)據(jù)塊中存放何種類型的數(shù)據(jù),塊都具有相同的結(jié)構(gòu),下圖列出一個(gè)Oracle塊的基本結(jié)構(gòu)。

數(shù)據(jù)塊的各組成部分分別介紹如下。
※ 塊頭部:塊頭部包含塊中一般的屬性信息,如塊的物理地址、塊所屬的段的類型(如數(shù)據(jù)段、索引段、回退段等)。
※ 表目錄:如果塊中存儲(chǔ)的數(shù)據(jù)是表數(shù)據(jù)(表中一行或多行記錄),則表目錄中存儲(chǔ)關(guān)于該表的相關(guān)信息。
※ 行目錄:如果塊中存儲(chǔ)的數(shù)據(jù)為表數(shù)據(jù)(表中的一行或多行記錄),則在行目錄中保存這些記錄的相關(guān)信息。
※ 空閑空間:空閑空間是塊中尚未使用的存儲(chǔ)空間。當(dāng)向數(shù)據(jù)塊中添加新數(shù)據(jù)時(shí),將減小空閑空間。
※ 行空間:行空間是塊中已經(jīng)使用的存儲(chǔ)空間,在行空間中存儲(chǔ)了數(shù)據(jù)庫(kù)對(duì)象的數(shù)據(jù)。例如,表中的一行或多行記錄。
塊頭部、表目錄和行目錄共同組成塊的頭部信息區(qū)。塊的頭部信息區(qū)中并不存放實(shí)際的數(shù)據(jù)庫(kù)數(shù)據(jù),它只起到引導(dǎo)系統(tǒng)讀取數(shù)據(jù)的作用。因此,如果頭部信息區(qū)被損壞,則整個(gè)數(shù)據(jù)塊將失效,數(shù)據(jù)塊中存儲(chǔ)的數(shù)據(jù)將丟失。而空閑空間和行空間則共同構(gòu)成塊的存儲(chǔ)區(qū),空閑空間和行空間的總和就是塊的總?cè)萘俊?/p>
2.2.2 盤(pán)區(qū)
盤(pán)區(qū)是由一系列物理上連續(xù)存放的數(shù)據(jù)塊所構(gòu)成的Oracle存儲(chǔ)結(jié)構(gòu),由一個(gè)或多個(gè)數(shù)據(jù)塊組成一個(gè)盤(pán)區(qū),而一個(gè)或多個(gè)盤(pán)區(qū)組成一個(gè)段。當(dāng)一個(gè)段中的所有空間被使用后,系統(tǒng)將自動(dòng)為該段分配一個(gè)新的盤(pán)區(qū)。盤(pán)區(qū)是Oracle存儲(chǔ)分配的最小單位。
在Oracle中創(chuàng)建帶有實(shí)際存儲(chǔ)結(jié)構(gòu)的數(shù)據(jù)庫(kù)對(duì)象時(shí),Oracle將為對(duì)象分配相應(yīng)的盤(pán)區(qū),以構(gòu)成一個(gè)段來(lái)提供存儲(chǔ)空間。當(dāng)段中已經(jīng)分配的區(qū)寫(xiě)滿后,Oracle將為段分配一個(gè)新的區(qū),以便容納更多的數(shù)據(jù)庫(kù)。
2.2.3 段
段是由一系列區(qū)組成的,它也不再是存儲(chǔ)空間的分配單位,而是一個(gè)獨(dú)立的邏輯存儲(chǔ)結(jié)構(gòu)。對(duì)于具有獨(dú)立存儲(chǔ)結(jié)構(gòu)的對(duì)象,它的數(shù)據(jù)全部存儲(chǔ)在保存它的段中。一個(gè)段只屬于一個(gè)特定的數(shù)據(jù)庫(kù)對(duì)象,每當(dāng)創(chuàng)建一個(gè)具有獨(dú)立段的數(shù)據(jù)庫(kù)對(duì)象時(shí),Oracle將為它創(chuàng)建一個(gè)段。例如,在Oracle中創(chuàng)建表時(shí)會(huì)為它分配若干個(gè)區(qū),以組成表的數(shù)據(jù)段。
在Oracle中,不同類型的數(shù)據(jù)庫(kù)對(duì)象擁有不同類型的段。根據(jù)段中存放的數(shù)據(jù)庫(kù)對(duì)象類型,可以將段分為幾種類型:數(shù)據(jù)段、索引段、臨時(shí)段、回退段和LOB段。
1. 數(shù)據(jù)段
在數(shù)據(jù)段中保存的是表中的記錄。在用戶創(chuàng)建表的同時(shí),Oracle系統(tǒng)將為表創(chuàng)建數(shù)據(jù)段。Oracle中所有未分區(qū)的表都使用一個(gè)段來(lái)保存數(shù)據(jù)。
當(dāng)表中的數(shù)據(jù)增加時(shí),數(shù)據(jù)段也將變大,數(shù)據(jù)段的增大過(guò)程是通過(guò)添加新盤(pán)區(qū)實(shí)現(xiàn)的。在表空間中創(chuàng)建了多少個(gè)表,相應(yīng)地,在該表空間中就有同量的數(shù)據(jù)段,并且數(shù)據(jù)段的名稱與它對(duì)應(yīng)的表名相同。
2. 索引段
在索引段中保存的是索引中的索引信息。在使用CREATE INDEX語(yǔ)句創(chuàng)建索引,或者在定義約束是自動(dòng)創(chuàng)建索引的同時(shí),Oracle將為索引創(chuàng)建它的索引段。
3. 臨時(shí)段
當(dāng)用戶執(zhí)行查詢等操作時(shí),Oracle可能會(huì)需要使用到一些臨時(shí)存儲(chǔ)空間,用于臨時(shí)保存解析過(guò)的查詢語(yǔ)句,以及在排序過(guò)程中產(chǎn)生的臨時(shí)數(shù)據(jù)。Oracle會(huì)自動(dòng)在專門(mén)用于存儲(chǔ)臨時(shí)數(shù)據(jù)的表空間為操作分配臨時(shí)段。
在執(zhí)行如下幾種類型的SQL語(yǔ)句時(shí),Oracle都會(huì)在臨時(shí)表空間中為語(yǔ)句操作分配一個(gè)臨時(shí)段。
※ CREATE INDEX
※ SELECT …ORDER BY
※ SELECT DISTINCT
※ SELECT … GROUP BY
※ SELECT … UNION
※ SELECT … INTERSECT
※ SELECT … MINUS
如果經(jīng)常需要執(zhí)行上面類型的語(yǔ)句,最好調(diào)整SORT_AREA_SIZE初始化參數(shù)來(lái)增大排序區(qū),使排序操作盡量能夠在內(nèi)存中完成,以獲得更好的性能。
當(dāng)操作執(zhí)行完畢后,為該操作分配的臨時(shí)段將被釋放。當(dāng)帶有排序的操作十分頻繁時(shí),臨時(shí)段的分配和釋放也將十分頻繁,因此為了提高性能,Oracle創(chuàng)建了一個(gè)獨(dú)立的臨時(shí)表空間,并在其中存放臨時(shí)段,這樣可以避免與其他表空間爭(zhēng)用存儲(chǔ)空間。
4. 回退段
回退段用于保存回退條目,Oracle將用戶修改前的值保存在回退條目中。利用這些信息,用戶可以撤銷未提交的操作,Oracle則可以利用回退段來(lái)維護(hù)數(shù)據(jù)庫(kù)的讀寫(xiě)一致性,并能夠在實(shí)例崩潰時(shí)進(jìn)行恢復(fù)。
在Oracle 11g中,回退也稱為“撤銷管理”,并且不需要為數(shù)據(jù)庫(kù)創(chuàng)建多個(gè)回退段,也不需要管理回退段,只需要?jiǎng)?chuàng)建一個(gè)撤銷表空間。對(duì)回退段的管理由Oracle自動(dòng)完成,就是自動(dòng)撤銷管理。
5. LOB段
如果表中含有如CLOB和BLOB等大對(duì)象類型數(shù)據(jù)時(shí),系統(tǒng)將創(chuàng)建LOB段以存儲(chǔ)相應(yīng)的大型對(duì)象數(shù)據(jù)。LOB段獨(dú)立于保存表中其他數(shù)據(jù)的數(shù)據(jù)段。
2.2.4 表空間
表空間是在Oracle中用戶可以使用的最大的邏輯存儲(chǔ)結(jié)構(gòu),用戶在數(shù)據(jù)庫(kù)中建立的所有內(nèi)容都被存儲(chǔ)在表空間中。Oracle使用表空間將相關(guān)的邏輯結(jié)構(gòu)組合在一起,表空間在物理上與數(shù)據(jù)文件相對(duì)應(yīng),每個(gè)表空間是由一個(gè)或多個(gè)數(shù)據(jù)文件組成的,一個(gè)數(shù)據(jù)文件只可以屬于一個(gè)表空間,這是邏輯與物理的統(tǒng)一。所以存儲(chǔ)空間在物理上表現(xiàn)為數(shù)據(jù)文件,而在邏輯上表現(xiàn)為表空間。數(shù)據(jù)庫(kù)管理員可以創(chuàng)建若干個(gè)表空間,也可以為表空間增加或刪除數(shù)據(jù)文件。表空間通過(guò)數(shù)據(jù)文件來(lái)擴(kuò)大,表空間大小等于構(gòu)成該表空間的所有數(shù)據(jù)文件大小之和。
由于表空間物理上對(duì)應(yīng)了操作系統(tǒng)的一個(gè)或多個(gè)數(shù)據(jù)文件,因此在表空間中創(chuàng)建的對(duì)象,在物理上可以有如下兩種存儲(chǔ)方式。
※ 若表空間只對(duì)應(yīng)一個(gè)數(shù)據(jù)文件,該表空間中所有的對(duì)象都存儲(chǔ)在這個(gè)數(shù)據(jù)文件中。
※ 若表空間對(duì)應(yīng)于多個(gè)數(shù)據(jù)文件,Oracle可將一個(gè)對(duì)象存儲(chǔ)在該表空間的任意一個(gè)數(shù)據(jù)文件中。事實(shí)上,Oracle可以將同一個(gè)對(duì)象的數(shù)據(jù)分布在表空間的多個(gè)數(shù)據(jù)文件中。
在創(chuàng)建數(shù)據(jù)庫(kù)時(shí),Oracle會(huì)自動(dòng)創(chuàng)建一些默認(rèn)的表空間,其中除了用于存儲(chǔ)用戶數(shù)據(jù)的普通表空間外,在一個(gè)數(shù)據(jù)庫(kù)中還會(huì)存在3種類型的表空間:SYSTEM表空間、撤銷表空間和臨時(shí)表空間。這三種表空間的創(chuàng)建、維護(hù)與管理都與普通的用戶表空間不同,在本節(jié)中將分別進(jìn)行簡(jiǎn)單介紹。
1. SYSTEM表空間
在每個(gè)數(shù)據(jù)庫(kù)中,都有一個(gè)名為SYSTEM的表空間,即系統(tǒng)表空間。該表空間是在創(chuàng)建數(shù)據(jù)庫(kù)時(shí)自動(dòng)創(chuàng)建的,在SYSTEM表空間中存有如下信息。
※ 在SYSTEM表空間中存儲(chǔ)數(shù)據(jù)庫(kù)的數(shù)據(jù)字典和內(nèi)部系統(tǒng)表基表。數(shù)據(jù)字典是一組保存數(shù)據(jù)庫(kù)自身信息的內(nèi)部系統(tǒng)表和視圖。
※ 在SYSTEM表空間中存儲(chǔ)所有PL/ SQL程序的源代碼和解析代碼,包括存儲(chǔ)過(guò)程、函數(shù)、包和觸發(fā)器等。在需要保存大量PL/SQL程序的數(shù)據(jù)庫(kù)中,應(yīng)當(dāng)設(shè)置足夠大的SYSTEM表空間。
※ 在SYSTEM表空間中存儲(chǔ)數(shù)據(jù)庫(kù)對(duì)象(如視圖、對(duì)象類型說(shuō)明、同義詞和序列)的定義。當(dāng)在數(shù)據(jù)庫(kù)中創(chuàng)建一個(gè)新的對(duì)象時(shí),對(duì)象的實(shí)際數(shù)據(jù)可以存儲(chǔ)在其他表空間中,但對(duì)象的定義信息卻保存在SYSTEM表空間中。
通過(guò)使用如下的語(yǔ)句,可以查看數(shù)據(jù)庫(kù)中數(shù)據(jù)字典的信息。
select * from dict
查看內(nèi)部系統(tǒng)表的SQL。
select * from v$fixed_view_ definition
數(shù)據(jù)庫(kù)管理員DBA對(duì)數(shù)據(jù)庫(kù)系統(tǒng)中的數(shù)據(jù)字典必須有一個(gè)很深刻的了解,必須準(zhǔn)備一些基礎(chǔ)的SQL語(yǔ)句,通過(guò)這些SQL語(yǔ)句可以立即了解系統(tǒng)的狀況和數(shù)據(jù)庫(kù)的狀態(tài)。大量的讀取操作、少量的寫(xiě)入操作是該表空間的一個(gè)顯著的特點(diǎn)。
因此SYSTEM表空間對(duì)于Oracle數(shù)據(jù)庫(kù)而言是至關(guān)重要的。一般在SYSTEM表空間中只應(yīng)該保存屬于SYS模式的對(duì)象,即與Oracle自身相關(guān)的數(shù)據(jù),而用戶的對(duì)象和數(shù)據(jù)都應(yīng)當(dāng)保存在非SYSTEM表空間中。另外,在Oracle 10g和11g中,Oracle新增了表空間SYSAUX,以此作為SYSTEM表空間的輔助表空間,SYSAUX表空間一般不用于存儲(chǔ)用戶數(shù)據(jù),并由Oracle系統(tǒng)內(nèi)部自動(dòng)維護(hù)。
2. 撤銷表空間
撤銷表空間是特殊的表空間,它專門(mén)用來(lái)在自動(dòng)撤銷管理方式下存儲(chǔ)撤銷信息,即回退信息。當(dāng)數(shù)據(jù)庫(kù)進(jìn)行更新、插入、刪除等操作時(shí),新的數(shù)據(jù)被更新到原來(lái)的數(shù)據(jù)文件中,而舊的數(shù)據(jù)就被放到撤銷段中。如果數(shù)據(jù)需要回滾,那么可以從撤銷段將數(shù)據(jù)再?gòu)?fù)制到數(shù)據(jù)文件中,來(lái)完成數(shù)據(jù)的回退。在系統(tǒng)恢復(fù)時(shí),撤銷段可以用來(lái)撤銷沒(méi)有被提交的數(shù)據(jù),解決系統(tǒng)的一致性問(wèn)題。
除了撤銷段外,在撤銷表空間中不能建立任何其他類型的段,即任何數(shù)據(jù)庫(kù)用戶都不能在撤銷表空間中創(chuàng)建數(shù)據(jù)庫(kù)對(duì)象(如表、索引等)。在撤銷表空間中,存在大量的寫(xiě)入操作,而只有少量的讀取操作。
數(shù)據(jù)庫(kù)管理員可以為數(shù)據(jù)庫(kù)創(chuàng)建多個(gè)撤銷表空間,但是每個(gè)數(shù)據(jù)庫(kù)實(shí)例最多只能使用一個(gè)撤銷表空間。在使用DBCA創(chuàng)建數(shù)據(jù)庫(kù)時(shí),一般會(huì)自動(dòng)建立一個(gè)默認(rèn)的撤銷表空間UNDOTBS。在建立數(shù)據(jù)庫(kù)后,也可以根據(jù)需要?jiǎng)?chuàng)建其他的撤銷表空間,并設(shè)置數(shù)據(jù)庫(kù)實(shí)例所使用的撤銷表空間。
3. 臨時(shí)表空間
在實(shí)例運(yùn)行過(guò)程中,Oracle必須使用一些臨時(shí)空間來(lái)保存SQL語(yǔ)句在執(zhí)行過(guò)程中所產(chǎn)生的臨時(shí)數(shù)據(jù)。在Oracle 11g中,系統(tǒng)為所有數(shù)據(jù)庫(kù)用戶指定了一個(gè)專門(mén)的臨時(shí)表空間TEMP。在使用DBCA創(chuàng)建數(shù)據(jù)庫(kù)時(shí),會(huì)自動(dòng)建立默認(rèn)的臨時(shí)表空間TEMP。此外,在數(shù)據(jù)庫(kù)已經(jīng)建立以后,也可以使用CREATE TEMPORARY TABLESPACE語(yǔ)句來(lái)創(chuàng)建其他的臨時(shí)表空間。
在臨時(shí)表空間中,同一個(gè)實(shí)例中的所有SQL語(yǔ)句的排序操作將共享使用一個(gè)排序段。排序段在執(zhí)行第一條具有排序操作的SQL語(yǔ)句時(shí)被創(chuàng)建,在實(shí)例關(guān)閉時(shí)被釋放。
- OpenStack Cloud Computing Cookbook(Third Edition)
- LabVIEW程序設(shè)計(jì)基礎(chǔ)與應(yīng)用
- Access 數(shù)據(jù)庫(kù)應(yīng)用教程
- Python網(wǎng)絡(luò)爬蟲(chóng)從入門(mén)到實(shí)踐(第2版)
- Web開(kāi)發(fā)的貴族:ASP.NET 3.5+SQL Server 2008
- MATLAB 2020 從入門(mén)到精通
- PHP+MySQL+Dreamweaver動(dòng)態(tài)網(wǎng)站開(kāi)發(fā)實(shí)例教程
- Learning Unity 2D Game Development by Example
- C語(yǔ)言程序設(shè)計(jì)實(shí)驗(yàn)指導(dǎo) (第2版)
- C# and .NET Core Test Driven Development
- Unity 3D/2D移動(dòng)開(kāi)發(fā)實(shí)戰(zhàn)教程
- R數(shù)據(jù)科學(xué)實(shí)戰(zhàn):工具詳解與案例分析
- HTML+CSS+JavaScript網(wǎng)頁(yè)設(shè)計(jì)從入門(mén)到精通 (清華社"視頻大講堂"大系·網(wǎng)絡(luò)開(kāi)發(fā)視頻大講堂)
- ExtJS Web應(yīng)用程序開(kāi)發(fā)指南第2版
- Anaconda數(shù)據(jù)科學(xué)實(shí)戰(zhàn)