Oracle數(shù)據(jù)庫系統(tǒng)的體系結(jié)構(gòu)主要講解Oracle這款DBMS是如何設(shè)計(jì)和實(shí)現(xiàn)的。整體上Oracle數(shù)據(jù)庫分為輔存中的Oracle(一般稱為數(shù)據(jù)庫,分為數(shù)據(jù)庫物理存儲(chǔ)結(jié)構(gòu)和邏輯存儲(chǔ)結(jié)構(gòu))和內(nèi)存中的Oracle(一般稱為實(shí)例,分為內(nèi)存結(jié)構(gòu)和后臺(tái)進(jìn)程)。
-----------------------------------------存儲(chǔ)結(jié)構(gòu)--------------------------------------------
一 物理存儲(chǔ)結(jié)構(gòu)
1. 數(shù)據(jù)文件
① 數(shù)據(jù)文件是在物理上保存數(shù)據(jù)庫中數(shù)據(jù)的操作系統(tǒng)文件,是所有數(shù)據(jù)的實(shí)際存儲(chǔ)空間。所有數(shù)據(jù)文件大小之和構(gòu)成了數(shù)據(jù)庫的大小。
② 數(shù)據(jù)文件的特點(diǎn)
(1) 一個(gè)數(shù)據(jù)文件僅與一個(gè)數(shù)據(jù)庫聯(lián)系
(2) 一個(gè)表空間由一個(gè)或多個(gè)數(shù)據(jù)文件組成
(3) 數(shù)據(jù)文件可以通過設(shè)置其自動(dòng)擴(kuò)展參數(shù),實(shí)現(xiàn)其自動(dòng)擴(kuò)展的功能
③ 數(shù)據(jù)文件可以分為永久性數(shù)據(jù)文件和臨時(shí)性數(shù)據(jù)文件
④ 用戶表中的數(shù)據(jù)最終存儲(chǔ)在數(shù)據(jù)文件中,但無法指定存儲(chǔ)在哪一個(gè)數(shù)據(jù)文件中。(該特點(diǎn)與SQLSever不同,SQLServer可以指定存儲(chǔ)數(shù)據(jù)文件)
⑤ 雖然無法指定,但我們可以通過數(shù)據(jù)字典dba_data_files或者v$datafile查看數(shù)據(jù)文件信息。
2. 控制文件
① 控制文件是一個(gè)記錄數(shù)據(jù)庫結(jié)構(gòu)信息的重要的二進(jìn)制文件,用于描述和維護(hù)數(shù)據(jù)庫的物理結(jié)構(gòu)。由Oracle系統(tǒng)進(jìn)行讀寫操作,DBA不能直接操作控制文件。
④ 一個(gè)數(shù)據(jù)庫至少需要一個(gè)控制文件,如果控制文件損壞將導(dǎo)致數(shù)據(jù)庫無法啟動(dòng)。(SQLsever中一個(gè)數(shù)據(jù)庫只需要日志文件和主數(shù)據(jù)文件,其中主數(shù)據(jù)文件包含了控制文件的內(nèi)容。)
⑤ 查看控制文件中的信息
3. 重做日志文件
① 重做日志文件是以重做記錄的形式記錄、保存用戶對(duì)數(shù)據(jù)庫進(jìn)行的變更操作,是數(shù)據(jù)庫中最重要的物理文件。
② 對(duì)于"最重要的物理文件"的理解
重做日志文件可以進(jìn)行事務(wù)的重做(Redo)或回退(Undo),是數(shù)據(jù)庫實(shí)例恢復(fù)的基礎(chǔ)。如果現(xiàn)在有數(shù)據(jù)修改,數(shù)據(jù)文件只能記錄修改之后的數(shù)據(jù),而重做日志文件不僅記錄修改之前的數(shù)據(jù),還記錄修改之后的新數(shù)據(jù),因此重做日志文件的內(nèi)容更多,若數(shù)據(jù)庫發(fā)生故障,重做日志文件就可以發(fā)揮其作用了。
4. 歸檔重做日志文件
5. 初始化參數(shù)文件
① 初始化參數(shù)文件是數(shù)據(jù)庫啟動(dòng)過程所必需的文件,記錄了數(shù)據(jù)庫顯式參數(shù)的設(shè)置。
② 數(shù)據(jù)庫啟動(dòng)的第一步就是根據(jù)初始化參數(shù)文件中的設(shè)置,創(chuàng)建并啟動(dòng)實(shí)例,即分配內(nèi)存空間、啟動(dòng)后臺(tái)進(jìn)程。
③ 參數(shù)文件主要包括了數(shù)據(jù)庫名和控制文件所在路徑。參數(shù)文件分為文本參數(shù)文件和服務(wù)器參數(shù)文件。
6. 跟蹤文件
跟蹤文件是數(shù)據(jù)庫中重要的診斷文件。
跟蹤文件中包含數(shù)據(jù)庫系統(tǒng)運(yùn)行過程中所發(fā)生的重大事件的有關(guān)信息,可以為數(shù)據(jù)庫運(yùn)行故障的解決提供重要信息。
7. 警告文件
警告文件是特殊的跟蹤文件。
警告文件也是數(shù)據(jù)庫中重要的診斷文件,記錄數(shù)據(jù)庫在啟動(dòng)、關(guān)閉和運(yùn)行期間后臺(tái)進(jìn)程的活動(dòng)情況。
在數(shù)據(jù)庫出現(xiàn)故障時(shí),應(yīng)首先查看該文件,但文件中的信息與任何錯(cuò)誤狀態(tài)沒有必然的聯(lián)系。
8. 口令文件
二 邏輯存儲(chǔ)結(jié)構(gòu)
Oracle數(shù)據(jù)庫邏輯存儲(chǔ)結(jié)構(gòu)
1. 表空間
① 表空間是Oracle數(shù)據(jù)庫最大的邏輯存儲(chǔ)單元,一個(gè)表空間由多個(gè)段組成。
② 表空間與數(shù)據(jù)庫文件直接關(guān)聯(lián),一個(gè)表空間包含一個(gè)或多個(gè)數(shù)據(jù)文件,一個(gè)數(shù)據(jù)文件只能從屬于某一個(gè)表空間,數(shù)據(jù)庫對(duì)象就是存儲(chǔ)在表空間對(duì)應(yīng)的一個(gè)或多個(gè)數(shù)據(jù)文件中。
③ 一個(gè)數(shù)據(jù)對(duì)象(例如:表、視圖等)也要存儲(chǔ)在一個(gè)表空間中。數(shù)據(jù)庫的大小從邏輯上等于所有表空間大小之和。表空間的大小等于構(gòu)成表空間的所有數(shù)據(jù)文件之和。
④ 表空間的分類
-
系統(tǒng)表空間
1)System表空間
system表空間主要存儲(chǔ):
a. 數(shù)據(jù)庫的數(shù)據(jù)字典;
b. SQL程序源代碼和解釋代碼,包括存儲(chǔ)過程、函數(shù)、包、觸發(fā)器等;
c. 數(shù)據(jù)庫對(duì)象的定義,如表、視圖、序列、同義詞等。system表空間
2)SysAUX表空間
SYSAUX表空間是輔助系統(tǒng)表空間,主要用于存儲(chǔ)數(shù)據(jù)庫組件等信息,以減小SYSTEM表空間的負(fù)荷。sysaux表空間
-
非系統(tǒng)表空間
1)撤銷表空間(undotbsl)
專門進(jìn)行回滾信息的自動(dòng)管理,由UNDO_TABLESPACE參數(shù)設(shè)置。撤銷表空間2)臨時(shí)表空間(temp)
專門進(jìn)行臨時(shí)數(shù)據(jù)管理的表空間。
在數(shù)據(jù)庫實(shí)例運(yùn)行過程中,執(zhí)行排序等SQL語句時(shí)會(huì)產(chǎn)生大量的臨時(shí)數(shù)據(jù),這些臨時(shí)數(shù)據(jù)將保存在數(shù)據(jù)庫臨時(shí)表空間中。 臨時(shí)表空間專門用于排序的。臨時(shí)表空間3)用戶表空間(users)
保存用戶數(shù)據(jù)用戶表空間4)示例表空間(example)
示例表空間
-
大文件表空間與小文件表空間
⑤ 表空間的查詢
2. 段
① 段是由一個(gè)或多個(gè)連續(xù)或不連續(xù)的區(qū)組成的邏輯存儲(chǔ)單元,是表空間的組成單位。使用段的目的是用來保存特定對(duì)象。
② 段的種類有四種
(1) 數(shù)據(jù)段(表段)
數(shù)據(jù)段用來存儲(chǔ)表或簇的數(shù)據(jù),可以細(xì)分為表數(shù)據(jù)段、索引表數(shù)據(jù)段、分區(qū)表數(shù)據(jù)段及簇?cái)?shù)據(jù)段四種。
(2) 索引段
用來存放索引信息,主要包括存儲(chǔ)ROWID(行ID)和索引鍵。
索引段與其相應(yīng)的表段經(jīng)常會(huì)被同時(shí)訪問,為了減少硬盤訪問的沖突,索引段與數(shù)據(jù)段可以放到處于不同物理位置的表空間中。
(3) 臨時(shí)段
當(dāng)用戶進(jìn)行排序查詢時(shí),如果在指定的內(nèi)存無法完成排序,Oracle將自動(dòng)從用戶默認(rèn)的臨時(shí)表空間中指派臨時(shí)段進(jìn)行排序。會(huì)話結(jié)束,數(shù)據(jù)將從臨時(shí)段中自動(dòng)刪除。
(4) 回退段
回滾段用于保存數(shù)據(jù)庫的回滾信息,包含當(dāng)前未提交事務(wù)所修改的數(shù)據(jù)的原始版本。
一個(gè)事務(wù)只能使用一個(gè)回滾段存放它的回滾信息,但是一個(gè)回滾段可以存放多個(gè)事務(wù)的回滾信息。回滾段可以動(dòng)態(tài)創(chuàng)建和撤銷。
回滾段的作用:
-
事務(wù)回滾(Transaction Rollback)
事務(wù)提交若出現(xiàn)故障,可以通過回滾段將事務(wù)返回Undo(撤銷)隊(duì)列或者Redo(重做)隊(duì)列中。 -
讀一致性(Read Consistency)
出現(xiàn)"污讀"情況時(shí),發(fā)生"臟數(shù)據(jù)"。Oracle數(shù)據(jù)庫通過回滾段來防止污讀情況的出現(xiàn),實(shí)現(xiàn)讀一致性。 - 事務(wù)恢復(fù)(Transaction Recovery)
-
閃回查詢(Flashback Query)回滾段
3. 區(qū)
① 區(qū)是由一系列連續(xù)的數(shù)據(jù)塊構(gòu)成的邏輯存儲(chǔ)單元,是存儲(chǔ)空間分配的最小單位。
② 當(dāng)創(chuàng)建一個(gè)數(shù)據(jù)庫對(duì)象時(shí),Oracle為對(duì)象分配若干個(gè)區(qū),以構(gòu)成一個(gè)段來為對(duì)象提供初始的存儲(chǔ)空間。當(dāng)段中已分配的區(qū)都**寫滿后,Oracle會(huì)為段分配一個(gè)新區(qū),以容納更多的數(shù)據(jù)。
③ 一個(gè)數(shù)據(jù)塊只能屬于一個(gè)區(qū)。
④ 區(qū)的分配
可以通過使用UNIFORM選項(xiàng),指定所有段的初始區(qū)和后續(xù)區(qū)具有統(tǒng)一大小。
可以使用AUTOALLOCATE選項(xiàng)指定由Oracle自動(dòng)決定后續(xù)區(qū)大小。
用戶不能通過其他參數(shù)來干預(yù)區(qū)的分配。
⑤ 通常分配給對(duì)象的區(qū)將一直保留,不論區(qū)中的數(shù)據(jù)塊是否被使用。只有當(dāng)對(duì)象被刪除時(shí),區(qū)才會(huì)被回收。
4. 數(shù)據(jù)塊
最小的I/O單元,每次讀取都是以數(shù)據(jù)塊為單位的,讀取時(shí)不足一個(gè)數(shù)據(jù)塊,則按一塊為單位。
包括一個(gè)或者多個(gè)OS BLOCK(操作系統(tǒng)塊)
在數(shù)據(jù)庫創(chuàng)建時(shí)設(shè)置,不可更改。數(shù)據(jù)塊的大小由DB_BLOCK_SIZE參數(shù)設(shè)置標(biāo)準(zhǔn)塊。
分為標(biāo)準(zhǔn)塊和非標(biāo)準(zhǔn)塊。具有標(biāo)準(zhǔn)大小的數(shù)據(jù)塊為標(biāo)準(zhǔn)塊。
查看標(biāo)準(zhǔn)塊大小:
① 數(shù)據(jù)塊的結(jié)構(gòu)
(1) 塊頭部包括標(biāo)題、表目錄、行目錄三部分。
標(biāo)題包含塊的一般屬性信息,如塊的物理地址、塊所屬段的類型等;
表目錄包含數(shù)據(jù)塊中保存的表的信息;
行目錄包含數(shù)據(jù)塊中的行地址等信息。
(2) 行空間
行數(shù)據(jù)區(qū)是已經(jīng)使用的空間,保存數(shù)據(jù)庫的對(duì)象數(shù)據(jù)。是真正存放表數(shù)據(jù)和索引數(shù)據(jù)的地方。
(3) 空閑空間
空閑區(qū)是尚未使用的存儲(chǔ)空間,用于新行的插入或用來更新已存在的行。
② 數(shù)據(jù)塊的管理
(1) 行鏈接
當(dāng)向表格中插入數(shù)據(jù)時(shí),如果行的長度大于塊的大小,行的信息無法存放在一個(gè)塊中,就需要使用多個(gè)塊存放行信息,將多余的行信息存放于另一個(gè)塊中,再用指針鏈接,這稱為行鏈接。
(2) 行遷移
當(dāng)表格數(shù)據(jù)被更新時(shí),如果更新后的數(shù)據(jù)長度大于塊長度,Oracle會(huì)將整行的數(shù)據(jù)從原數(shù)據(jù)塊遷移到新的數(shù)據(jù)塊中,只在原數(shù)據(jù)塊中留下一個(gè)指針指向新數(shù)據(jù)塊,這稱為行遷移。
(3) 對(duì)塊的管理主要是對(duì)塊中可用存儲(chǔ)空間的管理,確定保留多少空閑空間,避免產(chǎn)生行鏈接、行遷移而影響數(shù)據(jù)的查詢效率。
對(duì)塊的管理分為自動(dòng)和手動(dòng)兩種。
- 自動(dòng)管理
如果建立表空間時(shí)使用本地管理方式,并且將段的管理方式設(shè)置為AUTO,則采用自動(dòng)方式管理塊。 - 手動(dòng)管理
DBA可以采用手動(dòng)管理方式,通過為段設(shè)置PCTFREE(percent free 空閑率)和PCTUSED(percent used使用率)兩個(gè)參數(shù)來控制數(shù)據(jù)塊中空閑空間的使用。數(shù)據(jù)塊狀態(tài):空閑Free,使用Used。
1)PCTFREE
空閑率指定塊中必須保留的最小空閑空間比例。
當(dāng)數(shù)據(jù)塊的自由空間百分率低于PCTFREE時(shí),此數(shù)據(jù)塊被標(biāo)志為USED,此時(shí)在數(shù)據(jù)塊中只可以進(jìn)行更新操作,而不可以進(jìn)行插入操作。該參數(shù)默認(rèn)為10。
2)PCTUSED
使用率指定可以向塊中插入數(shù)據(jù)時(shí),塊已使用的最大空間比列。
當(dāng)數(shù)據(jù)塊使用空間低于PCTUSED時(shí),此塊標(biāo)志為FREE,可以對(duì)數(shù)據(jù)塊中數(shù)據(jù)進(jìn)行插入操作;
反之,如果使用空間高于PCTUSED,則不可以進(jìn)行插入操作。
該參數(shù)默認(rèn)為10。
舉例文字理解
--------------------------------------------內(nèi)存體系-----------------------------------------
Oracle數(shù)據(jù)庫系統(tǒng)結(jié)構(gòu)(體系結(jié)構(gòu))的核心是內(nèi)存體系和存儲(chǔ)結(jié)構(gòu)。本次課主要學(xué)習(xí)Oracle的內(nèi)存體系,分為Oracle內(nèi)存結(jié)構(gòu)和Oracle進(jìn)程結(jié)構(gòu)兩部分。
內(nèi)存結(jié)構(gòu)核心是共享的SGA(描述內(nèi)存中各種數(shù)據(jù)存儲(chǔ)結(jié)構(gòu)),還包括進(jìn)程私有的PGA。
進(jìn)程結(jié)構(gòu)則以Oracle后臺(tái)進(jìn)程為核心,還包括服務(wù)器進(jìn)程和用戶進(jìn)程。
三 內(nèi)存結(jié)構(gòu)
實(shí)例:由系統(tǒng)全局區(qū)SGA和后臺(tái)進(jìn)程組成,是內(nèi)存結(jié)構(gòu)的核心。
1. 系統(tǒng)全局結(jié)構(gòu)(System Global Area,SGA)
SGA是由Oracle分配的共享內(nèi)存結(jié)構(gòu),包含一個(gè)數(shù)據(jù)庫實(shí)例的數(shù)據(jù)和控制信息。
SGA數(shù)據(jù)供所有的服務(wù)器進(jìn)程和后臺(tái)進(jìn)程共享,所以SGA又稱為共享全局區(qū)(Shared Global Area)
-
① 數(shù)據(jù)高速緩沖區(qū)
1)數(shù)據(jù)高速緩沖區(qū)的功能
a.存儲(chǔ)從數(shù)據(jù)文件中讀取出來的數(shù)據(jù)拷貝。應(yīng)用程序要訪問的數(shù)據(jù)必須從磁盤的數(shù)據(jù)文件讀到數(shù)據(jù)緩沖區(qū)中處理。(從數(shù)據(jù)文件讀取的數(shù)據(jù)要放在內(nèi)存中的數(shù)據(jù)高速緩沖區(qū))
b.在數(shù)據(jù)緩沖區(qū)中被修改后的數(shù)據(jù)由DBWR進(jìn)程寫到硬盤的數(shù)據(jù)文件中永久保存。(緩沖區(qū)相當(dāng)于一個(gè)車間,在緩沖區(qū)中對(duì)數(shù)據(jù)進(jìn)行處理,然后才寫入倉庫即數(shù)據(jù)文件)
c.提高獲取和更新數(shù)據(jù)的性能。(減少了對(duì)磁盤的IO操作)
2)工作過程
3)類型
a.臟緩存塊(Dirty Buffers):臟緩存塊中保存的是已經(jīng)被修改過的數(shù)據(jù)。
b.空閑緩存塊(Free Buffers):空閑緩存塊中不包含任何數(shù)據(jù),它們等待后臺(tái)進(jìn)程或服務(wù)器進(jìn)程向其中寫入數(shù)據(jù)。
c.命中緩存塊(Pinned Buffers):命中緩存塊是那些正被使用的數(shù)據(jù)塊,同時(shí)還有很多會(huì)話等待修改或訪問的數(shù)據(jù)塊。
d.干凈緩存塊(Clean Buffers):干凈緩存塊是指那些當(dāng)前沒有被使用,即將被換出內(nèi)存的緩存塊。
4)大小
數(shù)據(jù)高速緩沖區(qū)越大,用戶需要的數(shù)據(jù)在內(nèi)存中的可能性就越大,即緩存命中率越高,從而減少了Oracle訪問硬盤數(shù)據(jù)的次數(shù),提高了數(shù)據(jù)庫系統(tǒng)執(zhí)行的效率。
然而,如果數(shù)據(jù)高速緩沖區(qū)的值太大,Oracle就不得不在內(nèi)存中尋找更多的塊來定位所需要的數(shù)據(jù),反而降低了系統(tǒng)性能。顯然需要確定一個(gè)**合理的數(shù)據(jù)高速緩沖區(qū)大小。 **
DB_CACHE_SIZE(標(biāo)準(zhǔn)塊的緩沖區(qū)大小8k)
-
② 重做日志緩沖區(qū)
2)工作過程
1)重做日志緩沖區(qū)的功能
a.用于緩存用戶對(duì)數(shù)據(jù)庫進(jìn)行修改操作時(shí)生成的重做記錄。
b.為了提高工作效率,重做記錄并不是直接寫入重做日志文件中,而是首先被服務(wù)器進(jìn)程寫入重做日志緩沖區(qū)中,在一定條件下,再由日志寫入進(jìn)程(LGWR)把重做日志緩沖區(qū)的內(nèi)容寫入重做日志文件中做永久性保存。
在歸檔模式下,當(dāng)重做日志切換時(shí),由歸檔進(jìn)程(ARCH)將重做日志文件的內(nèi)容寫入歸檔文件中,即當(dāng)前日志文件寫滿了,LGWR將會(huì)切換一個(gè)文件寫入,即日志切換,然后原來已經(jīng)寫滿的文件就由Oracle保存到指定路徑,即歸檔。
非歸檔模式下,假設(shè)有3個(gè)日志文件,LGWR寫滿第1個(gè)就切換到第2個(gè),寫滿第2個(gè)切換到第3個(gè),當(dāng)?shù)?個(gè)寫滿了之后,又重新切換到第1個(gè)日志文件進(jìn)行寫入,將覆蓋掉原來第1個(gè)文件的內(nèi)容。工作過程3)大小
LOG_BUFFER參數(shù)
較大的重做日志緩沖區(qū),可以減少對(duì)重做日志文件寫的次數(shù),適合長時(shí)間運(yùn)行的、產(chǎn)生大量重做記錄的事務(wù)。 -
③ 共享池
1)共享池的功能
共享池用于緩存最近執(zhí)行過的SQL語句、PL/SQL程序和數(shù)據(jù)字典信息,是對(duì)SQL語句、PL/SQL程序進(jìn)行語法分析、編譯、執(zhí)行的區(qū)域。2)組成
a.庫緩存
庫緩存用于緩存已經(jīng)解釋并執(zhí)行過的SQL語句和PL/SQL程序代碼,以提高SQL或PL/SQL程序的執(zhí)行效率。
包括SQL工作區(qū)和PL/SQL工作區(qū)
舉例:實(shí)際上不是保存整條SQL語句,而是保存相似的語句結(jié)構(gòu)。查詢成績select * from 成績表 where 學(xué)號(hào)=…;
其中select * from 成績表
是每個(gè)學(xué)生操作的相似結(jié)構(gòu),這時(shí)將語句結(jié)構(gòu)保存,而學(xué)號(hào)
則作為一個(gè)變量來處理。
b.數(shù)據(jù)字典緩存區(qū)
數(shù)據(jù)字典緩存區(qū)保存最常用的數(shù)據(jù)字典信息(如表、字段)
舉例:select empno from emp。首先會(huì)在數(shù)據(jù)字典上查詢emp表,查詢到就保存在該數(shù)據(jù)字典緩存區(qū)中,之后查詢都首先在該緩存區(qū)查找。(字段也是)3)大小
SHARED_POOL_SIZE查看共享池大小。
合適的共享池大小,可使編譯過的程序代碼長駐內(nèi)存,大大降低重復(fù)執(zhí)行相同的SQL語句(相同結(jié)構(gòu))、PL/SQL程序的系統(tǒng)開銷,從而提高數(shù)據(jù)庫的性能。 ④ 大型池
1)功能
大型池是一個(gè)可選的內(nèi)存配置項(xiàng),主要為Oracle多線程服務(wù)器、服務(wù)器I/O進(jìn)程、數(shù)據(jù)庫備份與恢復(fù)操作、執(zhí)行具有大量排序操作的SQL語句、執(zhí)行并行化的數(shù)據(jù)庫操作等需要大量緩存的操作提供內(nèi)存空間。(即大量/臨時(shí)數(shù)據(jù)可以保存在大型池)
如果沒有大型池,上述操作所需要的緩存空間將在共享池或PGA中分配,因而影響共享池或PGA的使用效率。
2)大小
LARGE_POOL_SIZE查看⑤ Java池
1)功能
Java提供對(duì)Java程序設(shè)計(jì)的支持,用于存儲(chǔ)Java代碼、Java語句的語法分析表、Java語句的執(zhí)行方案和進(jìn)行Java程序開發(fā)。
2)大小
JAVA_POOL_SIZE
通常不小于20M,以便安裝Java虛擬機(jī)⑥ 流池
1)功能
流池是一個(gè)可選的內(nèi)存配置項(xiàng),用于對(duì)流的支持。
2)大小
STREAMS_POOL_SIZE
2. 程序(私有)全局區(qū)(Program/Private Global Area,PGA)
PGA是一個(gè)私有的內(nèi)存區(qū),不能共享,每個(gè)服務(wù)器進(jìn)程只能訪問自己的PGA,因此PGA又稱為私有全局區(qū)(Private Global Area)。PGA不在實(shí)例中。
系統(tǒng)同時(shí)為每個(gè)后臺(tái)進(jìn)程分配私有的PGA區(qū)。(不是只有服務(wù)進(jìn)程有PGA)
所有服務(wù)器進(jìn)程PGA與所有后臺(tái)進(jìn)程PGA大小的和,即為實(shí)例的PGA的大小。
PGA隨著服務(wù)器進(jìn)程與后臺(tái)進(jìn)程的啟動(dòng)而分配,隨著服務(wù)器進(jìn)程和后臺(tái)進(jìn)程的終止而被釋放。
① 排序區(qū)
存放排序操作(如創(chuàng)建索引、分組、多表連接)所產(chǎn)生的臨時(shí)數(shù)據(jù)。(優(yōu)先用大型池保存臨時(shí)數(shù)據(jù),沒有才用PGA和共享池)
② 游標(biāo)區(qū)
存放執(zhí)行游標(biāo)操作時(shí)所產(chǎn)生的數(shù)據(jù)。
③ 會(huì)話區(qū)
保存用戶會(huì)話所具有的權(quán)限、角色、性能統(tǒng)計(jì)信息。
④ 堆棧區(qū)(重要)
用于保存會(huì)話過程中的綁定變量、會(huì)話變量等私有信息。
如上面的select * from 成績表 where 學(xué)號(hào)=101
,這里的學(xué)號(hào)
就是所說的綁定變量或會(huì)話變量。
3. 查看內(nèi)存參數(shù)
查看SGA的基本信息
-
使用V$SGAINFO視圖查看SGA基本信息
-
使用show parameters 參數(shù)名 查看
比如
SQL>show parameters log_bufferlog_buffer
查看日志緩沖區(qū)大小
SQL>show parameters db_cache_size
查看數(shù)據(jù)高速緩沖區(qū),結(jié)果為0表示本實(shí)例采用了內(nèi)存自動(dòng)管理
SQL>show parameters size(如果不知道具體名稱可以用size)
查看所有帶size的參數(shù)
SQL>show parameters
查看所有參數(shù)
為什么用v$sgainfo
查詢的高速緩存區(qū)是1275068416,而size
里面的卻是0?
這是因?yàn)镺racle的默認(rèn)模式是內(nèi)存自動(dòng)管理模式(自動(dòng)分配管理)。show里面查詢的是我們原始設(shè)置的參數(shù)大小,v$sgainfo是當(dāng)前的內(nèi)存大小分配,由系統(tǒng)自動(dòng)調(diào)整。
四 進(jìn)程結(jié)構(gòu)
1. 進(jìn)程結(jié)構(gòu)的介紹
進(jìn)程是操作系統(tǒng)中一個(gè)獨(dú)立的可以調(diào)度的活動(dòng),用于完成指定的任務(wù)。進(jìn)程與程序的區(qū)別在于:
① 進(jìn)程是動(dòng)態(tài)的概念,即動(dòng)態(tài)創(chuàng)建,完成任務(wù)后立即消亡;而程序是一個(gè)靜態(tài)實(shí)體。
② 進(jìn)程強(qiáng)調(diào)執(zhí)行過程,而程序僅僅是指令的有序集合。
類型:
用戶進(jìn)程
服務(wù)器進(jìn)程
后臺(tái)進(jìn)程
2. Oracle服務(wù)進(jìn)程
① 專用服務(wù)器進(jìn)程
只能為一個(gè)用戶進(jìn)程提供服務(wù)。
(2)位于數(shù)據(jù)庫服務(wù)器中的Oracle監(jiān)聽程序探測到用戶進(jìn)程請(qǐng)求后,首先驗(yàn)證用戶進(jìn)程提供的用戶名和口令,驗(yàn)證通過后建立一個(gè)專用的服務(wù)器進(jìn)程為該用戶進(jìn)程提供服務(wù)。
(3)用戶提交一條SQL語句。
(4)專用服務(wù)器進(jìn)程首先判斷在共享池中是否存在類似的SQL語句。如果不存在,將為這條SQL語句保存到共享池,然后解析該語句。在解析過程中,服務(wù)器進(jìn)程將檢查該語句的語法正確性。同時(shí),該語句的私有數(shù)據(jù)和信息保存到服務(wù)器進(jìn)程的PGA中。
(5)解析完成后,服務(wù)器進(jìn)程開始在數(shù)據(jù)高速緩沖區(qū)中尋找SQL語句所要求的數(shù)據(jù)。如果數(shù)據(jù)不在數(shù)據(jù)高速緩沖區(qū)中,還需要從數(shù)據(jù)文件中將所需要的數(shù)據(jù)讀取到數(shù)據(jù)高速緩沖區(qū)中,同時(shí)返回給用戶。
(6)服務(wù)器進(jìn)程執(zhí)行SQL語句。如果SQL語句要對(duì)數(shù)據(jù)進(jìn)行更改,僅在數(shù)據(jù)高速緩沖區(qū)中對(duì)緩存塊進(jìn)行更改,并將更改所生成的重做記錄保存在重做日志緩存區(qū)中。將來,由LGWR進(jìn)程將重做記錄寫入重做日志文件,再由DBWR進(jìn)程將臟緩存塊寫入數(shù)據(jù)文件。
(7)執(zhí)行完畢后,服務(wù)器進(jìn)程將結(jié)果返回給用戶進(jìn)程。
② 共享服務(wù)器進(jìn)程
可以為多個(gè)用戶進(jìn)程提供服務(wù)。
(2)位于服務(wù)器中的Oracle監(jiān)聽程序探測到用戶進(jìn)程請(qǐng)求后,首先驗(yàn)證用戶進(jìn)程提供的用戶名和口令,驗(yàn)證通過后將該用戶進(jìn)程分配給一個(gè)調(diào)度進(jìn)程。
(3)用戶進(jìn)程直接與調(diào)度進(jìn)程(可能有多個(gè))進(jìn)行交互。
(4)用戶提交一條SQL語句,調(diào)度進(jìn)程對(duì)SQL語句進(jìn)行處理,然后將處理結(jié)果放入位于SGA中的一個(gè)“請(qǐng)求隊(duì)列”(只有一個(gè))中,同時(shí)將調(diào)度程序ID也存入請(qǐng)求隊(duì)列。
(5)當(dāng)某個(gè)共享服務(wù)器(多個(gè))進(jìn)程空閑時(shí),從“請(qǐng)求隊(duì)列”中取出一條處理后的SQL語句,并對(duì)該語句進(jìn)行解析和執(zhí)行,得到它所請(qǐng)求的數(shù)據(jù)。
(6)共享服務(wù)器進(jìn)程將處理結(jié)果放入SGA中的一個(gè)“響應(yīng)隊(duì)列”(有多個(gè))中。每個(gè)調(diào)度進(jìn)程都有一個(gè)對(duì)應(yīng)的“響應(yīng)隊(duì)列”。
(7)調(diào)度進(jìn)程定期檢查自己的“響應(yīng)隊(duì)列”,如果發(fā)現(xiàn)有自己送出請(qǐng)求的處理結(jié)果,則將結(jié)果取出。調(diào)度進(jìn)程根據(jù)處理結(jié)果中保存的調(diào)度程序ID來標(biāo)識(shí)該結(jié)果是否是自己的。
(8)調(diào)度程序?qū)⑻幚斫Y(jié)果返回給用戶進(jìn)程。
3. 后臺(tái)進(jìn)程
① DBWR進(jìn)程(數(shù)據(jù)庫寫入進(jìn)程)
- 把數(shù)據(jù)高速緩沖區(qū)中已經(jīng)被修改過的數(shù)據(jù)(臟緩存塊)成批寫入數(shù)據(jù)文件中永久保存,同時(shí)使數(shù)據(jù)高速緩沖區(qū)有更多的空閑緩存塊,保證服務(wù)器進(jìn)程將所需要的數(shù)據(jù)從數(shù)據(jù)文件中讀取到數(shù)據(jù)高速緩沖區(qū)中,提高緩存命中率。
- 啟動(dòng)DBWR進(jìn)程
a.執(zhí)行INSERT、UPDATE等操作時(shí) ,沒有足夠的空閑塊
b.當(dāng)檢查點(diǎn)發(fā)生時(shí),將啟動(dòng)DBWR進(jìn)程
c.當(dāng)數(shù)據(jù)緩存的LRU列表的長度達(dá)到初始化 DB_BLOCK_WRITE_BATCH指定值的一半時(shí)。
d.若發(fā)生超時(shí)(大約3秒未被啟動(dòng))
② LGWR進(jìn)程(日志寫入進(jìn)程)
- 日志寫入進(jìn)程負(fù)責(zé)把重做日志緩沖區(qū)的重做記錄一次性寫入重做日志文件中永久保存。
- 啟動(dòng)LGWR進(jìn)程
a.用戶通過COMMIT語句提交當(dāng)前事務(wù):事物對(duì)應(yīng)兩種數(shù)據(jù),一種是日志數(shù)據(jù)信息、一種是臟緩存塊中的用戶數(shù)據(jù)。提交后,前者直接由LGWR寫入日志文件,而后者則是還存在高速緩存區(qū)中,當(dāng)條件滿足后,由啟動(dòng)DBWR進(jìn)程確定。
b.重做日志緩存被寫滿三分之一(假如日志緩存區(qū)90MB,第一個(gè)事物是29MB,則不會(huì)啟動(dòng),仍可以寫入緩存區(qū),但第二個(gè)事物是60MB,超過30MB,馬上啟動(dòng)全部寫入)
c.DBWR進(jìn)程開始將臟緩存塊寫入數(shù)據(jù)文件時(shí)
d.每隔3秒,即發(fā)生一次超時(shí),將啟動(dòng)LGWR
③ CPKT進(jìn)程(檢查點(diǎn)進(jìn)程)
-
檢查點(diǎn)概念
檢查點(diǎn)是一個(gè)事件,①當(dāng)該事件發(fā)生時(shí)(每隔一段時(shí)間發(fā)生),DBWR進(jìn)程要把數(shù)據(jù)高速緩沖區(qū)中臟緩存塊寫入數(shù)據(jù)文件中,這時(shí),會(huì)使得LGWR進(jìn)程啟動(dòng),則會(huì)先寫重做日志緩沖區(qū),再臟緩存塊寫入數(shù)據(jù)文件。②同時(shí)Oracle將對(duì)數(shù)據(jù)庫控制文件和數(shù)據(jù)文件的頭部的同步序號(hào)進(jìn)行更新,以記錄下當(dāng)前的數(shù)據(jù)庫結(jié)構(gòu)和狀態(tài),保證數(shù)據(jù)的一致性。 -
CKPT進(jìn)程的作用
a.更新控制文件與數(shù)據(jù)文件的頭部,使其同步
b.觸發(fā)DBWR進(jìn)程,將臟緩存塊寫入數(shù)據(jù)文件(會(huì)先調(diào)用LGWR進(jìn)程)
④ SMON進(jìn)程(系統(tǒng)監(jiān)控進(jìn)程)
-
功能
a. 實(shí)例恢復(fù)- 執(zhí)行前滾(ROLL FORWARD),將重做日志信息已經(jīng)寫入到重做日志文件中但還數(shù)據(jù)還沒有寫入到數(shù)據(jù)文件中的已提交的數(shù)據(jù)寫入到數(shù)據(jù)文件。
- 在前滾完成后立即打開數(shù)據(jù)庫。此時(shí)用戶可以連接數(shù)據(jù)庫,但此時(shí)數(shù)據(jù)文件中可能存在一些沒有提交的數(shù)據(jù)需要回滾。
- 回滾沒有提交的事務(wù)
b. 回收不再使用的臨時(shí)空間。
c. 將各個(gè)表空間的空閑碎片(空閑塊)合并(表空間的存儲(chǔ)參數(shù)PCTINCREASE不為0時(shí))
因?yàn)閴K必須是連續(xù)的,因此中間的塊若有數(shù)據(jù)刪除,則產(chǎn)生空閑,這時(shí)就可以用SMON進(jìn)程合并這些空閑塊。
⑤ PMON進(jìn)程(進(jìn)程監(jiān)控進(jìn)程)
負(fù)責(zé)恢復(fù)失敗的用戶進(jìn)程或服務(wù)器進(jìn)程,并且釋放進(jìn)程所占用的資源。
清除非正常中斷的用戶進(jìn)程留下的孤兒會(huì)話,回退未提交的事務(wù),釋放會(huì)話所占用的鎖、SGA、PGA等資源。
監(jiān)控調(diào)度進(jìn)程和服務(wù)器進(jìn)程的狀態(tài),如果它們失敗,則嘗試重新啟動(dòng)它們,并釋放它們所占用的各種資源。
⑥ ARCH進(jìn)程(歸檔進(jìn)程)
歸檔進(jìn)程負(fù)責(zé)在日志切換后將已經(jīng)寫滿的重做日志文件復(fù)制到歸檔目標(biāo)(一個(gè)磁盤路徑)中,防止寫滿的重做日志文件被覆蓋
⑦ RECO進(jìn)程(恢復(fù)進(jìn)程)
RECO進(jìn)程負(fù)責(zé)在分布式數(shù)據(jù)庫環(huán)境中自動(dòng)解決分布式事務(wù)的故障。一個(gè)節(jié)點(diǎn)的RECO自動(dòng)解決所有的懸而未決的事務(wù)。當(dāng)一個(gè)數(shù)據(jù)庫服務(wù)器的RECO后臺(tái)進(jìn)程試圖建立同一遠(yuǎn)程服務(wù)器的通信,如果該遠(yuǎn)程服務(wù)器不可用或者網(wǎng)絡(luò)連接不能建立時(shí),RECO自動(dòng)地在一個(gè)時(shí)間間隔之后再次連接。
⑧ LCKn進(jìn)程(鎖進(jìn)程)
LCKn進(jìn)程用于Oracle并行服務(wù)器環(huán)境中。在數(shù)據(jù)庫中最多可以啟動(dòng)10個(gè)LCKn進(jìn)程,主要用于實(shí)例間的封鎖(鎖的是實(shí)例)。
⑨ Dnnn(調(diào)度進(jìn)程)
Dnnn進(jìn)程是多線程服務(wù)器(Multithreaded Server,MTS)的組成部分,以后臺(tái)進(jìn)程的形式運(yùn)行。調(diào)度進(jìn)程接受用戶進(jìn)程請(qǐng)求,將它們放入請(qǐng)求隊(duì)列中,然后為請(qǐng)求隊(duì)列中的用戶進(jìn)程分配一個(gè)服務(wù)器進(jìn)程。最后,從響應(yīng)隊(duì)列返回?cái)?shù)據(jù)給用戶進(jìn)程
-----------------------------------學(xué)習(xí)Oracle的數(shù)據(jù)字典--------------------------------
前面課程已經(jīng)學(xué)習(xí)了Oracle數(shù)據(jù)庫系統(tǒng)的體系結(jié)構(gòu),但是針對(duì)一個(gè)具體的Oracle數(shù)據(jù)庫,我們應(yīng)該如何獲知該數(shù)據(jù)庫的結(jié)構(gòu)信息呢?一條記錄是如何在Oracle內(nèi)部被存儲(chǔ)管理的呢?本次課主要學(xué)習(xí)Oracle的數(shù)據(jù)字典,然后利用Oracle的數(shù)據(jù)字典來查看一條記錄是如何存儲(chǔ)的。
五 數(shù)據(jù)字典
數(shù)據(jù)字典是只讀的,只能由Oracle系統(tǒng)才能對(duì)字典管理維護(hù)
數(shù)據(jù)字典表 和 視圖 都屬于sys用戶,存儲(chǔ)于system表空間。
(注意:系統(tǒng)表空間不止包括system表空間)
Oracle數(shù)據(jù)字典保存數(shù)據(jù)本身的系統(tǒng)信息以及所有數(shù)據(jù)庫對(duì)象信息。
有
1.保存數(shù)據(jù)庫對(duì)象的定義信息。表、視圖、索引、同義詞、序列、存儲(chǔ)過程、函數(shù)、包、觸發(fā)器及其他各種對(duì)象。
2.數(shù)據(jù)庫存儲(chǔ)空間分配信息。
記錄數(shù)據(jù)庫對(duì)象分配了多少個(gè)區(qū)、使用了多少空間(區(qū))
3.數(shù)據(jù)庫安全信息。用戶、權(quán)限、角色、完整性
4.數(shù)據(jù)庫運(yùn)行時(shí)的性能(SGA分配合理?與PGA夠大?)和統(tǒng)計(jì)信息。
5.其他數(shù)據(jù)庫本身的基本信息。
數(shù)據(jù)字典用途
1.Oracle通過訪問數(shù)據(jù)字典判斷
用戶權(quán)限的合法性
模式對(duì)象的存在性: 表存在不存在
存儲(chǔ)空間的可用性 配額:給存儲(chǔ)空間分配的額度。
在user表空間中(insert ... into emp ) 假設(shè)用戶HR有權(quán)限添加
僅僅有權(quán)之外,還受制于用戶在user表空間的配額。假如分配的配額是1M,那么每次只能最大添加1M。
另一種含義:支持系統(tǒng)可以性,表空間如果脫機(jī)、查詢不了數(shù)據(jù)。
2.使用DDL語句修改數(shù)據(jù)庫對(duì)象后,Oracle將在數(shù)據(jù)字典中記錄所做的修改。
3.任何用戶都可以從數(shù)據(jù)字典只讀視圖中獲取各種數(shù)據(jù)庫對(duì)象信息。
4.DBA可從數(shù)據(jù)字典動(dòng)態(tài)性能視圖中獲取數(shù)據(jù)庫的運(yùn)行狀態(tài),作為進(jìn)行性能調(diào)整的依據(jù)。
數(shù)據(jù)字典的結(jié)構(gòu)
分為:
數(shù)據(jù)字典表 和 數(shù)據(jù)字典視圖
按數(shù)據(jù)字典對(duì)象的虛實(shí)性不同(數(shù)據(jù)字典的可變性),分為
靜態(tài)數(shù)據(jù)字典(數(shù)據(jù)不變) 和 動(dòng)態(tài)數(shù)據(jù)字典(實(shí)時(shí)記錄數(shù)據(jù)變化,數(shù)據(jù)可變)
2*2 = 4 一共得到四種數(shù)據(jù)字典
1.靜態(tài)數(shù)據(jù)字典表
在數(shù)據(jù)庫創(chuàng)建過程由sql.bsq自動(dòng)創(chuàng)建。由sys所有。
由$
結(jié)尾,如tab$
。只有Oracle才能讀寫,用戶不能讀,不直接使用。
2.靜態(tài)數(shù)據(jù)字典視圖
該數(shù)據(jù)字典是用戶該使用的。
為了用戶可讀,可使用靜態(tài)數(shù)據(jù)字典視圖。
catalog.sql腳本創(chuàng)建的靜態(tài)數(shù)據(jù)字典視圖和其別名。
如user_tables,由 _
組成。
3.動(dòng)態(tài)數(shù)據(jù)字典表
動(dòng)態(tài)數(shù)據(jù)字典表是在數(shù)據(jù)庫實(shí)例運(yùn)行過程中由Oracle動(dòng)態(tài)創(chuàng)建和維護(hù)的一系列“虛表”,在實(shí)例關(guān)閉時(shí)被釋放。
“虛表”,系統(tǒng)使用、用戶不使用,以X$開頭,由sys用戶所有。
4.動(dòng)態(tài)數(shù)據(jù)字典視圖
以v$
開頭,用戶可以使用,主要是管理員使用。動(dòng)態(tài)性能視圖又稱為V$視圖
,如動(dòng)態(tài)性能視圖V$DATAFILE
。
數(shù)據(jù)字典的使用
查詢數(shù)據(jù)字典信息
dictionary 獲取表或試圖的名稱和解釋
dict_columns 獲取的是表或視圖中 字段 的名稱和解釋 大寫
1.靜態(tài)數(shù)據(jù)字典表的使用
用戶不能對(duì)這些表直接操作。
2.靜態(tài)數(shù)據(jù)字典視圖
通常,用戶通過對(duì)靜態(tài)數(shù)據(jù)字典視圖的查詢可以獲取所需要的所有數(shù)據(jù)庫信息。
user_ 當(dāng)前數(shù)據(jù)庫用戶 所擁有的 所有模式對(duì)象 的信息
all_ 當(dāng)前數(shù)據(jù)庫用戶 可以訪問 的所有模式對(duì)象的信息
user是all的子集
dba_ 包含了所有數(shù)據(jù)庫對(duì)象信息,只有具有DBA角色的用戶才能夠訪問這些視圖
3.動(dòng)態(tài)性能表使用
都屬于sys用戶,用戶不能使用。
4.動(dòng)態(tài)性能視圖的使用
動(dòng)態(tài)性能視圖是SYS用戶所擁有的,在默認(rèn)情況下,只有SYS用戶和擁有DBA角色的用戶可以訪問。
不同模式下,執(zhí)行同一數(shù)據(jù)庫的數(shù)據(jù)字典視圖,信息可能不同。
不同狀態(tài)下,能使用的數(shù)據(jù)字典視圖不一樣。
nomount下,打開了初始化參數(shù)文件,可以使用與參數(shù)相關(guān)的視圖。
mount下,打開了控制文件,記錄了數(shù)據(jù)庫信息,可以訪問與數(shù)據(jù)庫相關(guān)的視圖
open下,可以訪問表了。
-----------------------------------------------------------------------------------------------------------------------------
Oracle體系結(jié)構(gòu)總結(jié)
一個(gè)數(shù)據(jù)庫分兩大部分
實(shí)例和存儲(chǔ)結(jié)構(gòu)
存儲(chǔ)結(jié)構(gòu)主要是物理存儲(chǔ)結(jié)構(gòu)
數(shù)據(jù)文件 控制文件 重做日志文件 歸檔文件
實(shí)例
后臺(tái)進(jìn)程:DBWR CKPT LGWR ARCH SMON PMON
實(shí)例內(nèi)存結(jié)構(gòu)SGA:數(shù)據(jù)高速緩沖區(qū) 日志緩沖區(qū) 共享池 大型池 Java池 流池 其他
用戶進(jìn)程發(fā)出請(qǐng)求,讓服務(wù)器進(jìn)程接收,然后服務(wù)器使用實(shí)例。
查詢操作select
服務(wù)進(jìn)程 到 數(shù)據(jù)高速緩沖區(qū) 查找 找到了返回給服務(wù)器進(jìn)程,再給用戶進(jìn)程。
若找不到,服務(wù)進(jìn)程則會(huì)通過 數(shù)據(jù)字典 打開數(shù)據(jù)文件,以塊為單位讀出數(shù)據(jù)塊,把這些塊放入數(shù)據(jù)高速緩沖區(qū)
然后服務(wù)進(jìn)程同時(shí)返回信息給用戶進(jìn)程。
修改操作updata
前提:數(shù)據(jù)高速緩沖區(qū)由DL(臟緩存塊列表,存放臟緩存塊的塊號(hào)) 和 LRU(最近最少列表) 管理。
服務(wù)進(jìn)程先找到數(shù)據(jù)高速緩沖區(qū),找到了,在數(shù)據(jù)緩沖區(qū)進(jìn)行修改,寫入臟緩存塊,然后將臟緩存塊放入DL。
若要再修改下一個(gè)update,發(fā)現(xiàn)數(shù)據(jù)緩沖區(qū)沒有空閑,
會(huì)再修改之前先生成重做日志記錄信息寫入日志緩沖區(qū),
寫完再修改緩存塊,再將緩存塊的地址放入DL,
最后會(huì)啟動(dòng)DBWR,將緩沖區(qū)數(shù)據(jù)寫入數(shù)據(jù)文件。
CKPT發(fā)生時(shí),會(huì)啟動(dòng)DBWR,要求DBWR將全部臟緩存塊寫入數(shù)據(jù)文件,
但DBWR啟動(dòng)之前,DBWR會(huì)要求LGWR啟動(dòng)先將對(duì)應(yīng)的日志緩存信息寫入到重做日志文件,
若LGWR寫一半時(shí),發(fā)現(xiàn)重做日志文件寫滿了,
則在歸檔模式下,ARCH進(jìn)程會(huì)啟動(dòng),將寫滿的重做日志文件在另一個(gè)路徑下寫入歸檔文件,
然后LGWR會(huì)繼續(xù)寫入日志緩沖區(qū),寫完后,DBWR將全部臟緩存塊寫入數(shù)據(jù)文件,
DBWR寫完之后,CKPT會(huì)在數(shù)據(jù)文件、控制文件、重做日志文件(非必須)的頭部寫入同步序列號(hào)。
若發(fā)現(xiàn)序列號(hào)不同,則用歸檔文件恢復(fù)。
在多表查詢下,會(huì)生成大量臨時(shí)數(shù)據(jù)。
此時(shí),若有大型池,先用大型池,
若無,則用服務(wù)進(jìn)程的PGA的排序區(qū),若不夠用
則共享池中存放,也可以使用臨時(shí)表空間。
邏輯存儲(chǔ)結(jié)構(gòu) 與 物理存儲(chǔ)結(jié)構(gòu)
結(jié)合案例更明晰。