數(shù)據(jù)庫(kù)結(jié)構(gòu)和空間管理一個(gè)ORACLE數(shù)據(jù)庫(kù)是數(shù)據(jù)的集合,被處理成一個(gè)單位。一個(gè)ORACLE數(shù)據(jù)庫(kù)有一個(gè)物理結(jié)構(gòu)和一個(gè)邏輯結(jié)構(gòu)。物理數(shù)據(jù)庫(kù)結(jié)構(gòu)(physical database structure)是由構(gòu)成數(shù)據(jù)庫(kù)的操作系統(tǒng)文件所決定。每一個(gè)ORACLE數(shù)據(jù)庫(kù)是由三種類(lèi)型的文件組成:數(shù)據(jù)文件、日志文件和控制文件。數(shù)據(jù)庫(kù)的文件為數(shù)據(jù)庫(kù)信息提供真正的物理存儲(chǔ)。邏輯數(shù)據(jù)庫(kù)結(jié)構(gòu)是用戶所涉及的數(shù)據(jù)庫(kù)結(jié)構(gòu)。一個(gè)ORACLE數(shù)據(jù)庫(kù)的邏輯結(jié)構(gòu)由下列因素決定:l 一個(gè)或多個(gè)表空間l 數(shù)據(jù)庫(kù)模式對(duì)象(即表、視圖、索引、聚集、序列、存儲(chǔ)過(guò)程)邏輯存儲(chǔ)結(jié)構(gòu)如表空間(dataspace)、段(segment)和范圍將支配一個(gè)數(shù)據(jù)庫(kù)的物理空間如何使用。模式對(duì)象(schema object)用它們之間的聯(lián)系組成了一個(gè)數(shù)據(jù)庫(kù)的關(guān)系設(shè)計(jì)。 1) 物理結(jié)構(gòu) (1) 數(shù)據(jù)文件每一個(gè)ORACLE數(shù)據(jù)庫(kù)有一個(gè)或多個(gè)物理的數(shù)據(jù)文件(data file)。一個(gè)數(shù)據(jù)庫(kù)的數(shù)據(jù)文件包含全部數(shù)據(jù)庫(kù)數(shù)據(jù)。邏輯數(shù)據(jù)庫(kù)結(jié)構(gòu)(如表、索引)的數(shù)據(jù)物理地存儲(chǔ)在數(shù)據(jù)庫(kù)的數(shù)據(jù)文件中。數(shù)據(jù)文件有下列特征:l 一個(gè)數(shù)據(jù)文件僅與一個(gè)數(shù)據(jù)庫(kù)聯(lián)系。l 一旦建立,數(shù)據(jù)文件不能改變大小l 一個(gè)表空間(數(shù)據(jù)庫(kù)存儲(chǔ)的邏輯單位)由一個(gè)或多個(gè)數(shù)據(jù)文件組成。 數(shù)據(jù)文件中的數(shù)據(jù)在需要時(shí)可以讀取并存儲(chǔ)在ORACLE內(nèi)存儲(chǔ)區(qū)中。例如:用戶要存取數(shù)據(jù)庫(kù)一表的某些數(shù)據(jù),如果請(qǐng)求信息不在數(shù)據(jù)庫(kù)的內(nèi)存存儲(chǔ)區(qū)內(nèi),則從相應(yīng)的數(shù)據(jù)文件中讀取并存儲(chǔ)在內(nèi)存。當(dāng)修改和插入新數(shù)據(jù)時(shí),不必立刻寫(xiě)入數(shù)據(jù)文件。為了減少磁盤(pán)輸出的總數(shù),提高性能,數(shù)據(jù)存儲(chǔ)在內(nèi)存,然后由 ORACLE后臺(tái)進(jìn)程DBWR決定如何將其寫(xiě)入到相應(yīng)的數(shù)據(jù)文件。 (2) 日志文件每一個(gè)數(shù)據(jù)庫(kù)有兩個(gè)或多個(gè)日志文件(redo log file)的組,每一個(gè)日志文件組用于收集數(shù)據(jù)庫(kù)日志。日志的主要功能是記錄對(duì)數(shù)據(jù)所作的修改,所以對(duì)數(shù)據(jù)庫(kù)作的全部修改是記錄在日志中。在出現(xiàn)故障時(shí),如果不能將修改數(shù)據(jù)永久地寫(xiě)入數(shù)據(jù)文件,則可利用日志得到該修改,所以從不會(huì)丟失已有操作成果。日志文件主要是保護(hù)數(shù)據(jù)庫(kù)以防止故障。為了防止日志文件本身的故障,ORACLE允許鏡象日志(mirrored redo log),以致可在不同磁盤(pán)上維護(hù)兩個(gè)或多個(gè)日志副本。日志文件中的信息僅在系統(tǒng)故障或介質(zhì)故障恢復(fù)數(shù)據(jù)庫(kù)時(shí)使用,這些故障阻止將數(shù)據(jù)庫(kù)數(shù)據(jù)寫(xiě)入到數(shù)據(jù)庫(kù)的數(shù)據(jù)文件。然而任何丟失的數(shù)據(jù)在下一次數(shù)據(jù)庫(kù)打開(kāi)時(shí),ORACLE自動(dòng)地應(yīng)用日志文件中的信息來(lái)恢復(fù)數(shù)據(jù)庫(kù)數(shù)據(jù)文件。 (3) 控制文件每一ORACLE數(shù)據(jù)庫(kù)有一個(gè)控制文件(control file),它記錄數(shù)據(jù)庫(kù)的物理結(jié)構(gòu),包含下列信息類(lèi)型:l 數(shù)據(jù)庫(kù)名;l 數(shù)據(jù)庫(kù)數(shù)據(jù)文件和日志文件的名字和位置;l 數(shù)據(jù)庫(kù)建立日期。為了安全起見(jiàn),允許控制文件被鏡象。每一次ORACLE數(shù)據(jù)庫(kù)的實(shí)例啟動(dòng)時(shí),它的控制文件用于標(biāo)識(shí)數(shù)據(jù)庫(kù)和日志文件,當(dāng)著手?jǐn)?shù)據(jù)庫(kù)操作時(shí)它們必須被打開(kāi)。當(dāng)數(shù)據(jù)庫(kù)的物理組成更改時(shí),ORACLE自動(dòng)更改該數(shù)據(jù)庫(kù)的控制文件。數(shù)據(jù)恢復(fù)時(shí),也要使用控制文件。 2) 邏輯結(jié)構(gòu)數(shù)據(jù)庫(kù)邏輯結(jié)構(gòu)包含表空間、段、范圍(extent)、數(shù)據(jù)塊和模式對(duì)象。(1) 表空間一個(gè)數(shù)據(jù)庫(kù)劃分為一個(gè)或多個(gè)邏輯單位,該邏輯單位稱(chēng)為表空間(TABLESPACE)。一個(gè)表空間可將相關(guān)的邏輯結(jié)構(gòu)組合在一起。DBA可利用表空間作下列工作:l 控制數(shù)據(jù)庫(kù)數(shù)據(jù)的磁盤(pán)分配。l 將確定的空間份額分配給數(shù)據(jù)庫(kù)用戶。l 通過(guò)使單個(gè)表空間在線或離線,控制數(shù)據(jù)的可用性。l 執(zhí)行部分?jǐn)?shù)據(jù)庫(kù)后備或恢復(fù)操作。l 為提高性能,跨越設(shè)備分配數(shù)據(jù)存儲(chǔ)。數(shù)據(jù)庫(kù)、表空間和數(shù)據(jù)文件之間的關(guān)系如下圖所示: Database SYSTEM DATA Tablespace Tablespace DTATAFILE1 (2MB) DATAFILE2 (2MB) DATAFILE3 (2MB) Driver1 Driver2 。每個(gè)數(shù)據(jù)庫(kù)可邏輯劃分為一個(gè)或多個(gè)表空間。每一個(gè)表空間是由一個(gè)或多個(gè)數(shù)據(jù)文件組成,該表空間物理地存儲(chǔ)表空間中全部邏輯結(jié)構(gòu)的數(shù)據(jù)。DBA可以建立新的表空間,可為表空間增加數(shù)據(jù)文件或可刪除數(shù)據(jù)文件,設(shè)置或更改缺省的段存儲(chǔ)位置。 每一個(gè)ORACLE數(shù)據(jù)庫(kù)包含有一個(gè)名為SYSTEM的表空間,在數(shù)據(jù)庫(kù)建立是自動(dòng)建立。在該表空間中總包含有整個(gè)數(shù)據(jù)庫(kù)的數(shù)據(jù)字典表。最小的數(shù)據(jù)庫(kù)可只需要SYSTEM表空間。該表空間必須總是在線。表和存儲(chǔ)的PL/SQL程序單元(過(guò)程、函數(shù)、包和觸發(fā)器)的全部存儲(chǔ)數(shù)據(jù)是存儲(chǔ)在SYSTEM表空間中。如果這些PL/SQL對(duì)象是為數(shù)據(jù)庫(kù)建的,DBA在SYSTEM表空間中需要規(guī)劃這些對(duì)象所需要的空間。表空間利用增加數(shù)據(jù)文件擴(kuò)大表空間,表空間的大小為組成該表空間的數(shù)據(jù)文件大小的和。DBA可以使ORACLE數(shù)據(jù)庫(kù)中任何表空間(除SYSTEM表空間外)在線(ONLINE)或離線(OFFLINE)。表空間通常是在線,以致它所包含的數(shù)據(jù)對(duì)數(shù)據(jù)庫(kù)用戶是可用的。當(dāng)表空間為離線時(shí),其數(shù)據(jù)不可使用。在下列情況下,DBA可以使其離線。。使部分?jǐn)?shù)據(jù)不可用,而剩余的部分允許正常存取。執(zhí)行離線的表空間后備。為了修改或維護(hù)一應(yīng)用,使它和它的一組表臨時(shí)不可用。包含有正在活動(dòng)的回滾段的表空間不能被離線,僅當(dāng)回滾段不正在使用時(shí),該表空間才可離線。在數(shù)據(jù)字典中記錄表空間的狀態(tài),在線還是離線。如果在數(shù)據(jù)庫(kù)關(guān)閉時(shí)一表空間為離線,那么在下次數(shù)據(jù)庫(kù)裝配和重新打開(kāi)后,它仍然保持離線。當(dāng)出現(xiàn)某些錯(cuò)誤時(shí),一個(gè)表空間可自動(dòng)地由在線改變?yōu)殡x線。通過(guò)使用多個(gè)表空間,將不同類(lèi)型的數(shù)據(jù)分開(kāi),更方便DBA來(lái)管理數(shù)據(jù)庫(kù)。ORACLE 數(shù)據(jù)庫(kù)中一表空間是由一個(gè)或多個(gè)物理數(shù)據(jù)文件組成,一個(gè)數(shù)據(jù)文件只可與一個(gè)表空間想聯(lián)系。當(dāng)為一表空間建立一數(shù)據(jù)文件時(shí),ORACLE建立該文件,分配指定的磁盤(pán)空間容量。在數(shù)據(jù)文件初時(shí)建立后,所分配的磁盤(pán)不包含任何數(shù)據(jù)。表空間可以在線或離線。在ORACLE中還允許單獨(dú)數(shù)據(jù)文件在線或離線。 (2) 段、范圍和數(shù)據(jù)塊ORACLE通過(guò)段、范圍和數(shù)據(jù)塊邏輯數(shù)據(jù)結(jié)構(gòu)可更細(xì)地控制磁盤(pán)空間的使用。 段段(SEGMENT)包含表空間中一種指定類(lèi)型的邏輯存儲(chǔ)結(jié)構(gòu),是由一組范圍組成。在ORACLE數(shù)據(jù)庫(kù)中有幾種類(lèi)型的段:數(shù)據(jù)段、牽引段、回滾段和臨時(shí)段。數(shù)據(jù)段:對(duì)于每一個(gè)非聚集的表有一數(shù)據(jù)段,表的所有數(shù)據(jù)存放在該段。每一聚集有一個(gè)數(shù)據(jù)段,聚集中每一個(gè)表的數(shù)據(jù)存儲(chǔ)在該段中。索引段:每一個(gè)索引有一索引段,存儲(chǔ)索引數(shù)據(jù)?;貪L段:是由DBA建立,用于臨時(shí)存儲(chǔ)要撤消的信息,這些信息用于生成讀一致性數(shù)據(jù)庫(kù)信息、在數(shù)據(jù)庫(kù)恢復(fù)時(shí)使用、回滾未提交的事務(wù)。臨時(shí)段:當(dāng)一個(gè)SQL語(yǔ)句需要臨時(shí)工作區(qū)時(shí),由ORACLE建立。當(dāng)語(yǔ)句執(zhí)行完畢,臨時(shí)段的范圍退回給系統(tǒng)。ORACLE對(duì)所有段的空間分配,以范圍為單位。 范圍一個(gè)范圍(EXTENT)是數(shù)據(jù)庫(kù)存儲(chǔ)空間分配的一個(gè)邏輯單位,它由連續(xù)數(shù)據(jù)塊所組成。每一個(gè)段是由一個(gè)或多個(gè)范圍組成。當(dāng)一段中間所有空間已完全使用時(shí),ORACLE為該段分配一個(gè)新的范圍。為了維護(hù)的目的,在數(shù)據(jù)庫(kù)的每一段含有段標(biāo)題塊(segment header block)說(shuō)明段的特征以及該段中的范圍目錄。 數(shù)據(jù)塊數(shù)據(jù)塊(data block)是ORACLE管理數(shù)據(jù)文件中存儲(chǔ)空間的單位,為數(shù)據(jù)庫(kù)使用的I/O的最小單位,其大小可不同于操作系統(tǒng)的標(biāo)準(zhǔn)I/O塊大小。 數(shù)據(jù)塊的格式:公用的變長(zhǎng)標(biāo)題表目錄行目錄未用空間行數(shù)據(jù) (3) 模式和模式對(duì)象一個(gè)模式(schema)為模式對(duì)象(scehma object)的一個(gè)集合,每一個(gè)數(shù)據(jù)庫(kù)用戶對(duì)應(yīng)一個(gè)模式。模式對(duì)象為直接引用數(shù)據(jù)庫(kù)數(shù)據(jù)的邏輯結(jié)構(gòu),模式對(duì)象包含如表、視圖、索引、聚集、序列、同義詞、數(shù)據(jù)庫(kù)鏈、過(guò)程和包等結(jié)構(gòu)。模式對(duì)象是邏輯數(shù)據(jù)存儲(chǔ)結(jié)構(gòu),每一種模式對(duì)象在磁盤(pán)上沒(méi)有一個(gè)相應(yīng)文件存儲(chǔ)其信息。一個(gè)模式對(duì)象邏輯地存儲(chǔ)在數(shù)據(jù)庫(kù)的一個(gè)表空間中,每一個(gè)對(duì)象的數(shù)據(jù)物理地包含在表空間的一個(gè)或多個(gè)數(shù)據(jù)文件中。 表表(table)為數(shù)據(jù)庫(kù)中數(shù)據(jù)存儲(chǔ)的基本單位,其數(shù)據(jù)按行、列存儲(chǔ)。每個(gè)表具有一表名和列的集合。每一列有一個(gè)列名、數(shù)據(jù)類(lèi)型、寬度或精度、比例。一行是對(duì)應(yīng)單個(gè)記錄的列信息的集合。 視圖一個(gè)視圖(view)是由一個(gè)或多個(gè)表(或其他視圖)中的數(shù)據(jù)的一種定制的表示,是用一個(gè)查詢定義,所以可認(rèn)為是一個(gè)存儲(chǔ)的查詢(stored query)或是一個(gè)虛表(virtual table)。視圖可在使用表的許多地方使用。由于視圖是由表導(dǎo)出的,視圖和表存在許多類(lèi)似,視圖象表最多可定義254列。視圖可以被查詢,而在修改、插入或刪除時(shí)具有一定的限制,在視圖上執(zhí)行的全部操作真正地影響視圖的基本表中的數(shù)據(jù),受到基本表的完整性約束和觸發(fā)器的限制。視圖與表不同,一個(gè)視圖不分配任何存儲(chǔ)空間,視圖不真正地包含數(shù)據(jù)。由查詢定義的視圖相應(yīng)于視圖引用表中的數(shù)據(jù)。視圖只在數(shù)據(jù)字典中存儲(chǔ)其定義。引入視圖有下列好處:。通過(guò)限制對(duì)表的行預(yù)定義集合的存取,為表提供附加的安全性。隱藏?cái)?shù)據(jù)復(fù)雜性。。為用戶簡(jiǎn)化命令。為基本表的數(shù)據(jù)提供另一種觀點(diǎn)。。可將應(yīng)用隔離基本表定義的修改。用于不用視圖無(wú)法表示的查詢。。可用于保存復(fù)雜查詢。 聚集聚集(cluster)是存儲(chǔ)表數(shù)據(jù)的可選擇的方法。一個(gè)聚集是一組表,將具有同一公共列值的行存儲(chǔ)在一起,并且它們經(jīng)常一起使用。這些公共列構(gòu)成聚集碼。例如:EMP表各DEPT表共享DEPTNO列,所以EMP表和DEPT表可聚集在一起,聚集碼的列為DEPTNO列,該聚集將每個(gè)部門(mén)的全部職工行各該部門(mén)的行物理地存儲(chǔ)在同一數(shù)據(jù)塊中。 索引索引(index)是與表和聚集相關(guān)的一種選擇結(jié)構(gòu)。索引是為提高數(shù)據(jù)檢索的性能而建立,利用它可快速地確定指定的信息。ORACLE索引為表數(shù)據(jù)提供快速存取路徑。索引適用于一范圍的行查詢或指定行的查詢。索引可建立在一表的一列或多列上,一旦建立,由ORACLE自動(dòng)維護(hù)和使用,對(duì)用戶是完全透明的。索引是邏輯地和物理地獨(dú)立于數(shù)據(jù),它們的建立或刪除對(duì)表沒(méi)有影響,應(yīng)用可繼續(xù)處理。索引數(shù)據(jù)的檢索性能幾乎保持常數(shù),而當(dāng)一表上存在許多索引時(shí),修改、刪除和插入操作的性能會(huì)下降。索引有唯一索引各非唯一索引。唯一索引保證表中沒(méi)有兩行在定義索引的列上具有重復(fù)值。ORACLE在唯一碼上自動(dòng)地定義唯一索引實(shí)施UNIQUE完整性約束。組合索引是在表的某個(gè)列上所建立的一索引。組全索引可加快SELECT語(yǔ)句的檢索速度,在其WHERE子句中可引用組合索引的全部或主要部分 。所以在定義中給出列的次序,將經(jīng)常存取的或選擇最多的列放在首位。在建立索引時(shí),將在表空間自動(dòng)地建立一索引段,索引段空間分配和保留空間的使用受下列方式控制:索引段范圍的分配常駐該索引段的存儲(chǔ)參數(shù)控制。其數(shù)據(jù)塊中未用空間可受該段的PCTFREE參數(shù)設(shè)置所控制。 序列生成器序列生成器(sequence generator)產(chǎn)生序列號(hào)。在多用戶環(huán)境下該序列生成器特別有用,可生成各返回序列號(hào)而不需要磁盤(pán)I/O或事務(wù)封鎖。序列號(hào)為ORACLE整數(shù),最多可有38個(gè)數(shù)字。一個(gè)序列定義指出一般信息:序列的名字、上升或下降、序列號(hào)之間間距和其它信息。對(duì)所有序列的確的定義以行存儲(chǔ)在SYSTEM表空間中的數(shù)據(jù)字典表中,所以所有序列定義總是可用。由引用序列號(hào)的SQL語(yǔ)句使用序列號(hào),可生成一個(gè)新的序列號(hào)或使用當(dāng)前序列號(hào)。一旦在用戶會(huì)話中的SQL語(yǔ)句生成一序列號(hào),該序列號(hào)僅為該會(huì)話可用。序列號(hào)生成是獨(dú)立于表,所以同一序列生成器可用于一個(gè)和多個(gè)表。所生成序列號(hào)可用于生成唯一的主碼。
聯(lián)系客服