Oracle數(shù)據(jù)庫(kù)的管理運(yùn)行描述
以下的文章主要是從相關(guān)用戶(hù)的請(qǐng)求開(kāi)始入手的,Oracle數(shù)據(jù)庫(kù)完整的相關(guān)工作機(jī)制是如何運(yùn)行得出?首先如果某個(gè)用戶(hù)相關(guān)進(jìn)程發(fā)出一個(gè)相關(guān)的連接請(qǐng)求的話(huà),如果你所使用的是主機(jī)命名或者是本地服務(wù)命中的主機(jī)名使用的是機(jī)器名(非IP地址)。
那么這個(gè)請(qǐng)求都會(huì)通過(guò)DNS服務(wù)器或HOST文件的服務(wù)名解析然后傳送到Oracle監(jiān)聽(tīng)進(jìn)程,監(jiān)聽(tīng)進(jìn)程接收到用戶(hù)請(qǐng)求后會(huì)采取兩種方式來(lái)處理這個(gè)用戶(hù)請(qǐng)求,下面我們分專(zhuān)用服務(wù)器和共享服務(wù)器分別采用這兩種方式時(shí)的情況來(lái)講:
專(zhuān)用服務(wù)器模式下:
一種方式是監(jiān)聽(tīng)進(jìn)程接收到用戶(hù)進(jìn)程請(qǐng)求后,產(chǎn)生一個(gè)新的專(zhuān)用服務(wù)器進(jìn)程,并且將對(duì)用戶(hù)進(jìn)程的所有控制信息傳給此服務(wù)器進(jìn)程,也就是說(shuō)新建的服務(wù)器進(jìn)程繼承了監(jiān)聽(tīng)進(jìn)程的信息,然后服務(wù)器進(jìn)程給用戶(hù)進(jìn)程發(fā)一個(gè)RESEND包,通知用戶(hù)進(jìn)程可以開(kāi)始給它發(fā)信息了,用戶(hù)進(jìn)程給這個(gè)新建的服務(wù)器進(jìn)程發(fā)一個(gè)CONNECT包,服務(wù)器進(jìn)程再以ACCEPT包回應(yīng)用戶(hù)進(jìn)程,致此,用戶(hù)進(jìn)程正式與服務(wù)器進(jìn)程確定連接。
我們把這種連接叫做HAND-OFF連接,也叫轉(zhuǎn)換連接。另一種方式是監(jiān)聽(tīng)進(jìn)程接收到用戶(hù)進(jìn)程的請(qǐng)求后產(chǎn)生一個(gè)新的專(zhuān)用服務(wù)器進(jìn)程,這個(gè)服務(wù)器進(jìn)程選用一個(gè)TCP/IP端口來(lái)控制與用戶(hù)進(jìn)程的交互,然后將此信息回傳給監(jiān)聽(tīng)進(jìn)程,監(jiān)聽(tīng)進(jìn)程再將此信息傳給用戶(hù)進(jìn)程。
用戶(hù)進(jìn)程使用這個(gè)端口給服務(wù)器進(jìn)程發(fā)送一個(gè)CONNECT包,服務(wù)器進(jìn)程再給用戶(hù)進(jìn)程發(fā)送一個(gè)ACCEPT包,致此,用戶(hù)進(jìn)程可以正式向服務(wù)器進(jìn)程發(fā)送信息了。
這種方式我們叫做重定向連接。HAND-OFF連接需要系統(tǒng)平臺(tái)具有進(jìn)程繼承的能力,為了使WINDOWS NT/2000支持HAND-OFF必須在HKEY_LOCAL_MACHINE>SOFTWARE>Oracle>HOMEX中設(shè)置USE_SHARED_SOCKET。
共享服務(wù)器模式下:
只有重定向連接的方式,工作方式是監(jiān)聽(tīng)進(jìn)程接收到用戶(hù)進(jìn)程的請(qǐng)求后產(chǎn)生一個(gè)新的調(diào)度進(jìn)程,這個(gè)調(diào)度進(jìn)程選用一個(gè)TCP/IP端口來(lái)控制與用戶(hù)進(jìn)程的交互,然后將此信息回傳給監(jiān)聽(tīng)進(jìn)程,監(jiān)聽(tīng)進(jìn)程再將此信息傳給用戶(hù)進(jìn)程,用戶(hù)進(jìn)程使用這個(gè)端口給調(diào)度進(jìn)程發(fā)送一個(gè)CONNECT包,調(diào)度進(jìn)程再給用戶(hù)進(jìn)程發(fā)送一個(gè)ACCEPT包,致此,用戶(hù)進(jìn)程可以正式向調(diào)度進(jìn)程發(fā)送信息了。
可以通過(guò)設(shè)置MAX_DISPIATCHERS這個(gè)參數(shù)來(lái)確定調(diào)度進(jìn)程的***數(shù)目,如果調(diào)度進(jìn)程的個(gè)數(shù)已經(jīng)達(dá)到了***,或者已有的調(diào)度進(jìn)程不是滿(mǎn)負(fù)荷,監(jiān)聽(tīng)進(jìn)程將不再創(chuàng)建新的調(diào)度進(jìn)程,而是讓其中一個(gè)調(diào)度進(jìn)程選用一個(gè)TCP/IP端口來(lái)與此用戶(hù)進(jìn)程交互。
調(diào)度進(jìn)程每接收一個(gè)用戶(hù)進(jìn)程請(qǐng)求都會(huì)在監(jiān)聽(tīng)進(jìn)程處作一個(gè)登記,以便監(jiān)聽(tīng)進(jìn)程能夠均衡每個(gè)調(diào)度進(jìn)程的負(fù)荷,所有的用戶(hù)進(jìn)程請(qǐng)求將分別在有限的調(diào)度進(jìn)程中排隊(duì),所有調(diào)度進(jìn)程再順序的把各自隊(duì)列中的部分用戶(hù)進(jìn)程請(qǐng)求放入同一個(gè)請(qǐng)求隊(duì)列。
等候多個(gè)Oracle數(shù)據(jù)庫(kù)的共享服務(wù)器進(jìn)程進(jìn)行處理(可以通過(guò)SHARED_SERVERS參數(shù)設(shè)置共享服務(wù)器進(jìn)程的個(gè)數(shù)),也就是說(shuō)所有的調(diào)度進(jìn)程共享同一個(gè)請(qǐng)求隊(duì)列,共享服務(wù)器模式下一個(gè)實(shí)例只有一個(gè)請(qǐng)求隊(duì)列,共享服務(wù)器進(jìn)程處理完用戶(hù)進(jìn)程的請(qǐng)求后將根據(jù)用戶(hù)進(jìn)程請(qǐng)求取自不同的調(diào)度進(jìn)程將返回結(jié)果放入不同的響應(yīng)隊(duì)列,也就是說(shuō)有多少調(diào)度進(jìn)程就有多少響應(yīng)隊(duì)列,然后各個(gè)調(diào)度進(jìn)程從各自的響應(yīng)隊(duì)列中將結(jié)果取出再返回給用戶(hù)進(jìn)程。
以上我們講完了用戶(hù)與Oracle的連接方式,下面我們要講Oracle服務(wù)器進(jìn)程如可處理用戶(hù)進(jìn)程的請(qǐng)求,當(dāng)一個(gè)用戶(hù)進(jìn)程發(fā)出了一條SQL語(yǔ)名:UPDATE TABBLEA SET SALARY=SALARY*2;首先,服務(wù)器進(jìn)程把這條語(yǔ)句的字符轉(zhuǎn)換成ASCII等效數(shù)字碼,接著這個(gè)ASCII碼被傳遞給一個(gè)HASH函數(shù),并返回一個(gè)HASH值,服務(wù)器進(jìn)程將到SHARED POOL 的共享PL/SQL區(qū)去查找是否存在同樣的HASH值。
如果存在,服務(wù)器進(jìn)程將使用這條語(yǔ)句已高速緩存在SHARED POOL中的已分析過(guò)的版本來(lái)執(zhí)行,如果不存在,服務(wù)器進(jìn)程將對(duì)該語(yǔ)句進(jìn)行語(yǔ)法分析,首先檢查該語(yǔ)句的語(yǔ)法的正確性,接著對(duì)語(yǔ)句中涉及的表、索引、視圖等對(duì)象進(jìn)行解析,并對(duì)照數(shù)據(jù)字典檢查這些對(duì)象的名稱(chēng)以及相關(guān)結(jié)構(gòu),并根據(jù)Oracle選用的優(yōu)化模式以及數(shù)據(jù)字典中是否存在相應(yīng)對(duì)象的統(tǒng)計(jì)數(shù)據(jù)和是否使用了存儲(chǔ)大綱來(lái)生成一個(gè)執(zhí)行計(jì)劃或從存儲(chǔ)大綱中選用一個(gè)執(zhí)行計(jì)劃,然后再用數(shù)據(jù)字典核對(duì)此用戶(hù)對(duì)相應(yīng)對(duì)象的執(zhí)行權(quán)限,***生成一個(gè)編譯代碼。
Oracle數(shù)據(jù)庫(kù)將這條語(yǔ)名的本身實(shí)際文本、HASH值、編譯代碼、與此語(yǔ)名相關(guān)聯(lián)的任何統(tǒng)計(jì)數(shù)據(jù)和該語(yǔ)句的執(zhí)行計(jì)劃緩存在SHARED POOL的共享PL/SQL區(qū)。服務(wù)器進(jìn)程通過(guò)SHARED POOL 鎖存器來(lái)申請(qǐng)可以向哪些共享PL/SQL區(qū)中緩存這此內(nèi)容,也就是說(shuō)被SHARED POOL鎖存器鎖定的PL/SQL區(qū)中的塊不可被覆蓋,因?yàn)檫@些塊可能被其它進(jìn)程所使用。
在SQL分析階段將用到LIBRARY CACHE,從數(shù)據(jù)字典中核對(duì)表、視圖等結(jié)構(gòu)的時(shí)候,需要將數(shù)據(jù)字典從磁盤(pán)讀入LIBRARY CACHE,因此,在讀入之前也要使用LIBRARY CACHE鎖存器來(lái)申請(qǐng)用于緩存數(shù)據(jù)字典。 生成編譯代碼之后,接著下一步服務(wù)器進(jìn)程要準(zhǔn)備開(kāi)始更新數(shù)據(jù),服務(wù)器進(jìn)程將到DB BUFFER中查找是否有相關(guān)對(duì)象的緩存數(shù)據(jù),
下面分兩個(gè)可能進(jìn)行解釋?zhuān)?/p>
如果沒(méi)有,服務(wù)器進(jìn)程將在表頭部請(qǐng)求一些行鎖,如果成功加鎖,服務(wù)器進(jìn)程將從數(shù)據(jù)文件中讀這些行所在的數(shù)據(jù)塊放入DB BUFFER中空閑的區(qū)域或者覆蓋已被擠出LRU列表的非臟數(shù)據(jù)塊緩沖區(qū),并且排列在LRU列表的頭部,如果這些非臟數(shù)據(jù)緩沖區(qū)寫(xiě)完也不能滿(mǎn)足新數(shù)據(jù)的請(qǐng)求時(shí),會(huì)立即觸發(fā)DBWN進(jìn)程將臟數(shù)據(jù)列表中指向的緩沖塊寫(xiě)入數(shù)據(jù)文件,并且清洗掉這些緩沖區(qū),來(lái)騰出空間緩沖新讀入的數(shù)據(jù),也就是在放入DB BUFFER之前也是要先申請(qǐng)DB BUFFER中的鎖存器。
成功鎖定后,再寫(xiě)入DB BUFFER,然后服務(wù)器程將該語(yǔ)句影響的被讀入DB BUFFER塊中的這些行的ROWID及將要更新的原值和新值及SCN等信息逐條的寫(xiě)入REDO LOG BUFFER,在寫(xiě)入REDO LOG BUFFER之前也是先請(qǐng)求REDO LOG BUFFER塊的鎖存器,成功鎖定之后才開(kāi)始寫(xiě)入,當(dāng)寫(xiě)入達(dá)到REDO LOG BUFFER大小的三分之一或?qū)懭肓窟_(dá)到1M或超過(guò)三秒后或發(fā)生檢查點(diǎn)時(shí)或者DBWN之前發(fā)生,LGWR將把REDO LOG BUFFER中的數(shù)據(jù)寫(xiě)入磁盤(pán)上的重做日志文件。
已被寫(xiě)入重做日志文件的REDO LOG BUFFER中的塊上的鎖存器被釋放,并可被后來(lái)寫(xiě)入的信息所覆蓋,REDO LOG BUFFER以循環(huán)的方式工作。當(dāng)一個(gè)重做日志文件寫(xiě)滿(mǎn)后,LGWR將切換到下一個(gè)重做日志文件,如果是歸檔模式,歸檔進(jìn)程還將前一個(gè)寫(xiě)滿(mǎn)的重做日志進(jìn)程寫(xiě)入歸檔日志文件,重做日志文件也是循環(huán)工作方式。寫(xiě)完所有的REDO LOG BUFFER之后,服務(wù)器進(jìn)程開(kāi)始改寫(xiě)這個(gè)DB BUFFER塊頭部的事務(wù)列表并寫(xiě)入SCN,然后COPY包含這個(gè)塊的頭部事務(wù)列表及SCN信息的數(shù)據(jù)副本放入回滾段中,我們將回滾段中的副本稱(chēng)為數(shù)據(jù)塊的“前映像”。
(回滾段可以存儲(chǔ)在專(zhuān)門(mén)的回滾表空間中,這個(gè)表空間由一個(gè)或多個(gè)物理文件組成,并專(zhuān)用于回滾表空間,回滾段也可在其它表空間中的數(shù)據(jù)文件中開(kāi)辟。)然后改寫(xiě)這個(gè)DB BUFFER塊的數(shù)據(jù),并在其頭部寫(xiě)入對(duì)應(yīng)的回滾段地址,如果對(duì)一行數(shù)據(jù)多次UPDATE而不COMMIT則在回滾段中將會(huì)有多個(gè)“前映像”,除***個(gè)“前映像”含有SCN信息外,其它的每個(gè)“前映像”的頭部還含有SCN信息和“前前映像”的回滾段地址。
一次UPDATE操作只對(duì)應(yīng)一個(gè)SCN。然后服務(wù)器進(jìn)程在臟數(shù)據(jù)列表中建立一條指向此緩沖塊的指針。接著服務(wù)器進(jìn)程會(huì)從數(shù)據(jù)文件讀入第二個(gè)塊重復(fù)以上讀入,記日志,建立回滾段,修改,放入臟列表的動(dòng)作,當(dāng)臟數(shù)據(jù)列表達(dá)到一定長(zhǎng)度時(shí),DBWN進(jìn)程將臟數(shù)據(jù)列表中指向的緩沖塊全部寫(xiě)入數(shù)據(jù)文件,也就是釋放加在這些DB BUFER 塊上的鎖存器。其實(shí)Oracle數(shù)據(jù)庫(kù)可以一次從數(shù)據(jù)文件中讀入幾個(gè)塊放入DB BUFFER,可以通過(guò)參數(shù)DB_FILE_MULTIBLOCK_READ_COUNT來(lái)設(shè)置一次讀入的塊的個(gè)數(shù)。
如果要查找的數(shù)據(jù)已緩存,則根據(jù)用戶(hù)的SQL操作類(lèi)型決定如何操作,如果是SELECT 則查看DB BUFFER塊的頭部是否有事務(wù),如果有,將從回滾段讀取,如果沒(méi)有則比較SELECT 的SCN與DB BUFFER塊頭部的SCN如果比自己大,仍然從回滾段讀取,如果比自己小則認(rèn)這是一個(gè)非臟緩存,可以直接從這個(gè)DB BUFFER塊中讀取。如果是UPDATE則即使在DB BUFFER中找到一個(gè)沒(méi)有事務(wù),而且SCN比自己小的非臟緩存數(shù)據(jù)塊,服務(wù)器進(jìn)程仍然要到表的頭部對(duì)這條記錄申請(qǐng)加鎖,加鎖成功則進(jìn)行后續(xù)動(dòng)作,如果不成功,則要等待前面的進(jìn)程解鎖后才能進(jìn)行動(dòng)作。
只有當(dāng)SQL語(yǔ)句影響的所有行所在的***一個(gè)塊被讀入DB BUFFER并且重做信息被寫(xiě)入REDO LOG BUFFER(僅是指重做日志緩沖,而非重做日志文件)之后,用戶(hù)才可以發(fā)出COMMIT,COMMIT觸發(fā)LGRW,但并不強(qiáng)制立即DBWN來(lái)釋放所有相應(yīng)的DB BUFFER塊上的鎖,也就是說(shuō)有可能出現(xiàn)已COMMIT,但在隨后的一段時(shí)間內(nèi)DBWN還在寫(xiě)這條語(yǔ)句涉及的數(shù)據(jù)塊的情形,表頭部的行鎖,并不是在COMMIT一發(fā)出就馬上釋放,實(shí)際上要等到相應(yīng)的DBWN進(jìn)程結(jié)束才會(huì)釋放。
一個(gè)用戶(hù)請(qǐng)求鎖定另一個(gè)用戶(hù)已COMMIT的資源不成功的機(jī)會(huì)是存在的,從COMMIT到DBWN進(jìn)程結(jié)束之間的時(shí)間很短,如果恰巧在這個(gè)時(shí)間斷電,由于COMMIT已觸發(fā)LGWR進(jìn)程,所以這些未來(lái)得及寫(xiě)入數(shù)據(jù)文件的改變會(huì)在實(shí)例重啟后由SMON進(jìn)程根據(jù)重做日志文件來(lái)前滾。如果未COMMIT就斷電,由于DBWN之前觸發(fā)LGWR,所有DBWN在數(shù)據(jù)文件上的修改都會(huì)被先一步記入重做日志文件,實(shí)例重啟后,SMON進(jìn)程再根據(jù)重做日志文件來(lái)回滾。
如果用戶(hù)ROOLBACK,則服務(wù)器進(jìn)程會(huì)根據(jù)數(shù)據(jù)文件塊和DB BUFFER中塊的頭部的事務(wù)列表和SCN以及回滾段地址找到回滾段中相應(yīng)的修改前的副本,并且用這些原值來(lái)還原當(dāng)前數(shù)據(jù)文件中已修改但未提交的改變。如果有多個(gè)“前映像”,服務(wù)器進(jìn)程會(huì)在一個(gè)“前映像”的頭部找到“前前映像”的回滾段地址,一直找到同一事務(wù)下的最早的一個(gè)“前映像”為止。一旦發(fā)出了COMMIT,用戶(hù)就不能ROOLBACK,這使得COMMIT后DBWN進(jìn)程還沒(méi)有全部完成的后續(xù)動(dòng)作得到了保障。
下面我們要提到檢查點(diǎn)的作用,當(dāng)一個(gè)全部檢查點(diǎn)發(fā)生的時(shí)候,首先讓LGWR進(jìn)程將REDO LOG BUFFER中的所有緩沖(包含未提交的重做信息)寫(xiě)入重做日志文件,然后讓DBWN進(jìn)程將DB BUFFER中所有已提交的緩沖寫(xiě)入數(shù)據(jù)文件(不強(qiáng)制寫(xiě)未提交的)。
然后更新控制文件和數(shù)據(jù)文件頭部的SCN,表明當(dāng)前數(shù)據(jù)庫(kù)是一致的,如果在發(fā)生檢點(diǎn)之前斷電,并且當(dāng)時(shí)有一個(gè)未提交的改變正在進(jìn)行,實(shí)例重啟之后,SMON進(jìn)程將從上一個(gè)檢查點(diǎn)開(kāi)始核對(duì)這個(gè)檢查點(diǎn)之后記錄在重做日志文件中已提交的和未提交改變,因?yàn)镈BWN之前會(huì)觸發(fā)LGWR,所以DBWN對(duì)數(shù)據(jù)文件的修改一定會(huì)被先記錄在重做日志文件中。
因此,斷電前被DBWN寫(xiě)進(jìn)數(shù)據(jù)文件的改變將通過(guò)重做日志文件中的記錄進(jìn)行還原,叫做回滾,如果斷電時(shí)有一個(gè)已提交,但DBWN動(dòng)作還沒(méi)有完全完成的改變存在,因?yàn)橐呀?jīng)提交,提交會(huì)觸發(fā)LGWR進(jìn)程,所以不管DBWN動(dòng)作是否已完成,該語(yǔ)句將要影響的行及其產(chǎn)生的結(jié)果一定已經(jīng)記錄在重做日志文件中了,則實(shí)例重啟后,SMON進(jìn)程根據(jù)重做日志文件進(jìn)行前滾。
由此可見(jiàn),實(shí)例失敗后用于恢復(fù)的時(shí)間由兩個(gè)檢查點(diǎn)之間的間隔大小來(lái)決定,我們可以通個(gè)四個(gè)參數(shù)設(shè)置檢查點(diǎn)執(zhí)行的頻率,LOG_CHECKPOINT_INTERVAL決定了兩個(gè)檢查點(diǎn)之間寫(xiě)入重做日志文件的系統(tǒng)物理塊的大小,LOG_CHECKPOINT_TIMEOUT決定了兩個(gè)檢查點(diǎn)之間的時(shí)間長(zhǎng)度,F(xiàn)AST_START_IO_TARGET決定了用于恢復(fù)時(shí)需要處理的塊的大小,F(xiàn)AST_START_MTTR_TARGET直接決定了用于恢復(fù)的時(shí)間的長(zhǎng)短。
SMON進(jìn)程執(zhí)行的前滾和回滾與用戶(hù)的回滾是不同的,SMON是根據(jù)重做日志文件進(jìn)行前滾或回滾,而用戶(hù)的回滾一定是根據(jù)回滾段的內(nèi)容進(jìn)行回滾的。在這里我們要說(shuō)一下回滾段存儲(chǔ)的數(shù)據(jù),假如是delete操作,則回滾段將會(huì)記錄整個(gè)行的數(shù)據(jù),假如是update,則回滾段只記錄被修改了的字段的變化前的數(shù)據(jù)(前映像),也就是沒(méi)有被修改的字段是不會(huì)被記錄的,假如是insert,則回滾段只記錄插入記錄的rowid。
這樣假如事務(wù)提交,那回滾段中簡(jiǎn)單標(biāo)記該事務(wù)已經(jīng)提交;假如是回退,則如果操作是是delete,回退的時(shí)候把回滾段中數(shù)據(jù)重新寫(xiě)回?cái)?shù)據(jù)塊,操作如果是update,則把變化前數(shù)據(jù)修改回去,操作如果是insert,則根據(jù)記錄的rowid 把該記錄刪除。
下面我們要講DBWN如何來(lái)寫(xiě)數(shù)據(jù)文件,在寫(xiě)數(shù)據(jù)文件前首先要找到可寫(xiě)的空閑數(shù)據(jù)塊,Oracle中空閑數(shù)據(jù)塊可以通過(guò)FREELIST或BITMAP來(lái)維護(hù),它們位于一個(gè)段的頭部用來(lái)標(biāo)識(shí)當(dāng)前段中哪些數(shù)據(jù)塊可以進(jìn)行INSERT。
在本地管理表空間中Oracle數(shù)據(jù)庫(kù)自動(dòng)管理分配給段的區(qū)的大小,區(qū)的分配信息存儲(chǔ)在組成表空間的數(shù)據(jù)文件的頭部,而數(shù)據(jù)字典管理的表空間用戶(hù)可以在創(chuàng)建時(shí)決定區(qū)的大小,并且區(qū)的分配信息是存儲(chǔ)在數(shù)據(jù)字典中的,只在本地管理的表空間中才能選用段自動(dòng)管理,采用自動(dòng)段空間管理的本地管理表空間中的段中的空閑數(shù)據(jù)塊的信息就存放在段的頭部并且使用位圖來(lái)管理,采用手動(dòng)管理的本地管理表空間中的段和數(shù)據(jù)字典管理的表空間中的段中的空閑數(shù)據(jù)塊的管理都使用位于段頭部的空閑列表來(lái)管理,
空閑列表的工作方式:
首先一個(gè)空的數(shù)據(jù)塊被加入空閑列表,當(dāng)其中空閑空間小于PCTFREE設(shè)置的值之后,這個(gè)塊從空閑列表刪除,當(dāng)這個(gè)塊中的內(nèi)容降至PCTUSED設(shè)置的值之下后,這個(gè)數(shù)據(jù)塊被再次加入空閑列表,位于空閑列表中的數(shù)據(jù)塊都是可以向其中INSERT的塊,當(dāng)一個(gè)塊移出了空閑列表,但只要其中還有保留空間就可以進(jìn)行UPDATE,當(dāng)對(duì)其中一行UPDATE一個(gè)大數(shù)據(jù)時(shí),如果當(dāng)前塊不能完全放下整個(gè)行,只會(huì)把整個(gè)行遷移到一個(gè)新的數(shù)據(jù)塊,并在原塊位置留下一個(gè)指向新塊的指針,這叫行遷移。
如果一個(gè)數(shù)據(jù)塊可以INSERT,當(dāng)插入一個(gè)當(dāng)前塊裝不下的行時(shí),這個(gè)行會(huì)溢出到兩個(gè)或兩個(gè)幾上的塊中,這叫行鏈接。如果用戶(hù)的動(dòng)作是INSERT 則服務(wù)器進(jìn)程會(huì)先鎖定FREELIST,然后找到空閑塊的地址,再釋放FREELIST,當(dāng)多個(gè)服務(wù)器進(jìn)程同時(shí)想要鎖定FREELIST時(shí)即發(fā)生FREELIST的爭(zhēng)用,可以在非采用自動(dòng)段空間管理的表空間中創(chuàng)建表時(shí)指定FREELIST的個(gè)數(shù)。
默認(rèn)為1,如果是在采用自動(dòng)段空間管理的表空間中創(chuàng)建表,即使指定了FREELIST也會(huì)被忽略,因?yàn)榇藭r(shí)將使用BITMAP而不是FREELIST來(lái)管理段中的空閑空間。如果用戶(hù)動(dòng)作是UPDATE服務(wù)器進(jìn)程將不會(huì)使用到FREELIST和BITMAP,因?yàn)椴灰ふ乙粋€(gè)空閑塊,而使用鎖的隊(duì)列。
【編輯推薦】
- Oracle 查詢(xún)記錄相關(guān)效率的查詢(xún)
- Oracle并發(fā)連接數(shù)的設(shè)置方案
- Oracle存取LONG類(lèi)型字段的方案描述
- Oracle存取LONG類(lèi)型字段的方案描述
- Oracle查詢(xún)優(yōu)化4大方面的主要途徑