資源描述:
《Oracle讀取數(shù)據(jù)》由會員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫。
1、下面我們要講ORACLE服務(wù)器進(jìn)程如可處理用戶進(jìn)程的請求,當(dāng)一個用戶進(jìn)程發(fā)出了一條SQL語名:UPDATETABBLEASETSALARY=SALARY*2;首先,服務(wù)器進(jìn)程把這條語句的字符轉(zhuǎn)換成ASCII等效數(shù)字碼,接著這個ASCII碼被傳遞給一個HASH函數(shù),并返回一個HASH值,服務(wù)器進(jìn)程將到SHAREDPOOL的共享區(qū)去查找是否存在同樣的HASH值,如果存在,服務(wù)器進(jìn)程將使用這條語句已高速緩存在SHAREDPOOL中的已分析過的版本來執(zhí)行,如果不存在,服務(wù)器進(jìn)程將對該語句進(jìn)行語法分析,首先檢查該語句的語法的正確性,接著對語句中涉及的表、索引、視圖等對象進(jìn)行解析,并對照數(shù)據(jù)字典檢查這
2、些對象的名稱以及相關(guān)結(jié)構(gòu),并根據(jù)ORACLE選用的優(yōu)化模式以及數(shù)據(jù)字典中是否存在相應(yīng)對象的統(tǒng)計(jì)數(shù)據(jù)和是否使用了存儲大綱來生成一個執(zhí)行計(jì)劃或從存儲大綱中選用一個執(zhí)行計(jì)劃,然后再用數(shù)據(jù)字典核對此用戶對相應(yīng)對象的執(zhí)行權(quán)限,最后生成一個編譯代碼。ORACLE將這條語名的本身實(shí)際文本、HASH值、編譯代碼、與此語名相關(guān)聯(lián)的任何統(tǒng)計(jì)數(shù)據(jù)和該語句的執(zhí)行計(jì)劃緩存在SHAREDPOOL共享區(qū)。服務(wù)器進(jìn)程通過SHAREDPOOL鎖存器來申請?jiān)诠蚕韰^(qū)中分配空間緩存這此內(nèi)容,也就是說被SHAREDPOOL鎖存器鎖定的塊不可被覆蓋,因?yàn)檫@些塊可能被其它進(jìn)程所使用。在SQL分析階段將用到字典CACHE,從數(shù)據(jù)字典中核
3、對表、視圖等結(jié)構(gòu)的時候,需要將數(shù)據(jù)字典從磁盤讀入字典CACHE中,因此,在讀入之前也要使用字典CACHE鎖存器來申請用于緩存數(shù)據(jù)字典。生成編譯代碼之后,接著下一步服務(wù)器進(jìn)程要準(zhǔn)備開始更新數(shù)據(jù),服務(wù)器進(jìn)程將到DBBUFFER中查找是否有相關(guān)對象的緩存數(shù)據(jù),下面分兩個可能進(jìn)行解釋:如果沒有,服務(wù)器進(jìn)程將在表頭部請求一些行鎖,如果成功加鎖,服務(wù)器進(jìn)程將從數(shù)據(jù)文件中讀這些行所在的數(shù)據(jù)塊放入DBBUFFER中空閑的區(qū)域或者覆蓋已被擠出LRU列表的非臟數(shù)據(jù)塊緩沖區(qū),并且排列在LRU列表的頭部,如果這些非臟數(shù)據(jù)緩沖區(qū)寫完也不能滿足新數(shù)據(jù)的請求時,會立即觸發(fā)DBWN進(jìn)程將臟數(shù)據(jù)列表中指向的緩沖塊寫入數(shù)據(jù)文
4、件,并且清洗掉這些緩沖區(qū),來騰出空間緩沖新讀入的數(shù)據(jù),也就是在放入DBBUFFER之前也是要先申請DBBUFFER中的鎖存器,成功鎖定后,再寫入DBBUFFER,然后服務(wù)器程將該語句影響的被讀入DBBUFFER塊中的這些行的ROWID及將要更新的原值和新值及SCN等信息逐條的寫入REDOLOGBUFFER,在寫入REDOLOGBUFFER之前也是先請求REDOLOGBUFFER塊的鎖存器,成功鎖定之后才開始寫入,當(dāng)寫入達(dá)到REDOLOGBUFFER大小的三分之一或?qū)懭肓窟_(dá)到1M或超過三秒后或發(fā)生檢查點(diǎn)時或者DBWN之前發(fā)生,LGWR將把REDOLOGBUFFER中的數(shù)據(jù)寫入磁盤上的重做日志
5、文件,已被寫入重做日志文件的REDOLOGBUFFER中的塊上的鎖存器被釋放,并可被后來寫入的信息所覆蓋,REDOLOGBUFFER以循環(huán)的方式工作。當(dāng)一個重做日志文件寫滿后,LGWR將切換到下一個重做日志文件,如果是歸檔模式,歸檔進(jìn)程還將前一個寫滿的重做日志進(jìn)程寫入歸檔日志文件,重做日志文件也是循環(huán)工作方式。寫完所有的REDOLOGBUFFER之后,服務(wù)器進(jìn)程開始改寫這個DBBUFFER塊頭部的事務(wù)列表并寫入SCN,然后COPY包含這個塊的頭部事務(wù)列表及SCN信息的數(shù)據(jù)副本放入回滾段中,我們將回滾段中的副本稱為數(shù)據(jù)塊的“前映像”。(回滾段可以存儲在專門的回滾表空間中,這個表空間由一個或多
6、個物理文件組成,并專用于回滾表空間,回滾段也可在其它表空間中的數(shù)據(jù)文件中開辟。)然后改寫這個DBBUFFER塊的數(shù)據(jù),并在其頭部寫入對應(yīng)的回滾段地址,如果對一行數(shù)據(jù)多次UPDATE而不COMMIT則在回滾段中將會有多個“前映像”,除第一個“前映像”含有SCN(Systemchangenumber)信息外,其它的每個“前映像”的頭部還含有SCN信息和“前前映像”的回滾段地址。一次UPDATE操作只對應(yīng)一個SCN。然后服務(wù)器進(jìn)程在臟數(shù)據(jù)列表中建立一條指向此緩沖塊的指針。接著服務(wù)器進(jìn)程會從數(shù)據(jù)文件讀入第二個塊重復(fù)以上讀入,記日志,建立回滾段,修改,放入臟列表的動作,當(dāng)臟數(shù)據(jù)列表達(dá)到一定長度時,D
7、BWN進(jìn)程將臟數(shù)據(jù)列表中指向的緩沖塊全部寫入數(shù)據(jù)文件,也就是釋放加在這些DBBUFER塊上的鎖存器。其實(shí)ORACLE可以一次從數(shù)據(jù)文件中讀入幾個塊放入DBBUFFER,可以通過參數(shù)DB_FILE_MULTIBLOCK_READ_COUNT來設(shè)置一次讀入的塊的個數(shù)。如果要查找的數(shù)據(jù)已緩存,則根據(jù)用戶的SQL操作類型決定如何操作,如果是SELECT則查看DBBUFFER塊的頭部是否有事務(wù),如果有,將從回滾段讀取,如果沒有則比