溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

Oracle內(nèi)存結(jié)構(gòu)SGA、PGA、UGA的示例分析

發(fā)布時(shí)間:2021-12-13 11:27:03 來(lái)源:億速云 閱讀:169 作者:小新 欄目:關(guān)系型數(shù)據(jù)庫(kù)

這篇文章將為大家詳細(xì)講解有關(guān)Oracle內(nèi)存結(jié)構(gòu)SGA、PGA、UGA的示例分析,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

一、 系統(tǒng)全局區(qū)  (System Global Area, SGA):

SGA是一組共享內(nèi)存結(jié)構(gòu), 被所有的服務(wù)和后臺(tái)進(jìn)程所共享。當(dāng)數(shù)據(jù)庫(kù)實(shí)例啟動(dòng)時(shí),系統(tǒng)全局區(qū)內(nèi)存被自動(dòng)分配。當(dāng)數(shù)據(jù)庫(kù)實(shí)例關(guān)閉時(shí),SGA內(nèi)存被回收。 SGA是占用內(nèi)存最大的一個(gè)區(qū)域,同時(shí)也是影響數(shù)據(jù)庫(kù)性能的重要因素。

查詢(xún)SGA區(qū)的情況:

SQL> show SGA

Total System Global Area 3290345472 bytes
Fixed Size 2217832 bytes
Variable Size 1795164312 bytes
Database Buffers 1476395008 bytes
Redo Buffers 16568320 bytes
SQL> select * from v$sga;

NAME              VALUE -------------------- ---------- Fixed Size 2217832 Variable Size 1795164312 Database Buffers 1476395008 Redo Buffers 16568320

Fixed Size表示固定區(qū)域,存儲(chǔ)SGA各個(gè)組件的信息。不能修改大小。

Variable Size表示可變區(qū)域,比如共享池、java池、大池等。

Database Buffers表示數(shù)據(jù)庫(kù)高速緩沖區(qū)。

Redo Buffers表示日志緩沖區(qū)。

固定SGA(Fixed SGA)

固定SGA:顧名思義,是一段不變的內(nèi)存區(qū),指向SGA中其他部分,Oracle通過(guò)它找到SGA中的其他區(qū),可以簡(jiǎn)單理解為用于管理的一段內(nèi)存區(qū)。

塊緩沖區(qū)(Database buffer cache)

數(shù)據(jù)高速緩沖區(qū)(Database Buffer Cache):用于存放從數(shù)據(jù)文件讀取的數(shù)據(jù)塊,由初始化參數(shù)DB_CACHE_SIZE決定。

工作原理和過(guò)程是 LRU(最近最少使用 Least Recently Used )。查詢(xún)時(shí),Oracle會(huì)先把從磁盤(pán)讀取的數(shù)據(jù)放入內(nèi)存供所有用戶(hù)共享,以后再查詢(xún)相關(guān)數(shù)據(jù)時(shí)不用再次讀取磁盤(pán)。插入和更新時(shí),Oracle會(huì)先在該區(qū)中緩存數(shù)據(jù),之后批量寫(xiě)到硬盤(pán)中。通過(guò)塊緩沖區(qū),Oracle可以通過(guò)內(nèi)存緩存提高磁盤(pán)的I/O性能(注:磁盤(pán)I/O的速率是毫米級(jí)的,而內(nèi)存I/O的速率為納秒級(jí))

數(shù)據(jù)高速緩存塊由許多大小相等的緩存塊組成,這些緩存塊的大小和OS塊大小相同。 這些緩存塊分為3大類(lèi)

  • 臟緩存塊( Dirty buffers ):臟緩存塊中保存的時(shí)被修改過(guò)的緩存塊。即當(dāng)一條SQL語(yǔ)句對(duì)某個(gè)緩存塊中的數(shù)據(jù)進(jìn)行修改后,該緩存塊就被標(biāo)記為臟緩存塊。最后該臟緩存塊被DBWn進(jìn)程寫(xiě)入到硬盤(pán)的數(shù)據(jù)文件中,永久保留起來(lái)。

  • 命中緩存塊( Pinned buffers ):命中緩存塊中保存的是最近正在被訪問(wèn)的緩存塊。它始終被保留中數(shù)據(jù)高速緩存中,不會(huì)被寫(xiě)入數(shù)據(jù)文件。

  • 空閑緩存塊(Free buffers):該緩存塊中沒(méi)有數(shù)據(jù),等待被寫(xiě)入數(shù)據(jù)。oracle從數(shù)據(jù)文件中讀取數(shù)據(jù)后,尋找空閑緩存塊,以便寫(xiě)入其中。

Oracle 通過(guò) 2 個(gè)列表(DIRTY、LRU)來(lái)管理緩存塊

   1、DIRTY 列表中保存已經(jīng)被修改但還沒(méi)有被寫(xiě)入到數(shù)據(jù)文件中的臟緩存塊。

   2、LRU列表中保存所有的緩存塊(還沒(méi)有被移動(dòng)到DIRTY列表中的臟緩存塊、空閑緩存塊、命中緩存塊)。當(dāng)某個(gè)緩存塊被訪問(wèn)后,該緩存塊就被移動(dòng)到LRU列表的頭部,其他緩存塊就向LRU列表的尾部移動(dòng)。放在最尾部的緩存塊就最先被移出LRU列表。

數(shù)據(jù)高速緩存的工作原理過(guò)程是:

   A、ORACLE在將數(shù)據(jù)文件中的數(shù)據(jù)塊復(fù)制到數(shù)據(jù)高速緩存中之前,先在數(shù)據(jù)高速緩存中找空閑緩存塊,以便容納該數(shù)據(jù)塊。Oracle 將從LRU列表的尾部開(kāi)始搜索,直到找到所需的空閑緩存塊為止。

   B、如果先搜索到的是臟緩存塊,將該臟緩存塊移動(dòng)到DIRTY列表中,然后繼續(xù)搜索。如果搜索到的是空閑緩存塊,則將數(shù)據(jù)塊寫(xiě)入,然后將該緩存塊移動(dòng)到DIRTY列表的頭部。

   C、如果能夠搜索到足夠的空閑緩存塊,就將所有的數(shù)據(jù)塊寫(xiě)入到對(duì)應(yīng)的空閑緩存塊中。則搜索寫(xiě)入過(guò)程結(jié)束。

   D、如果沒(méi)有搜索到足夠的空閑緩存塊,則ORACLE就先停止搜索,而是激活DBWn進(jìn)程,開(kāi)始將DIRTY列表中的臟緩存塊寫(xiě)入到數(shù)據(jù)文件中。

   E、已經(jīng)被寫(xiě)入到數(shù)據(jù)文件中的臟緩存塊將變成空閑緩存塊,并被放入到LRU列表中。執(zhí)行完成這個(gè)工作后,再重新開(kāi)始搜索,直到找到足夠的空閑緩存塊為止。

這里可以看出,如果你的高速緩沖區(qū)很小的,不停地寫(xiě)寫(xiě),造成很大I/O開(kāi)銷(xiāo)。

塊緩沖區(qū)可以配置1、2或3個(gè)緩沖池,默認(rèn)只有一個(gè)

  • 默認(rèn)池(Default pool):所有數(shù)據(jù)默認(rèn)都在這里緩存,除非你在建表的時(shí)候指定 Store(buffer_pool keep) or Store(buffer_pool recycle)。使用LRU算法管理。

  • 保持池(Keep pool):緩存需要多次重用的數(shù)據(jù),長(zhǎng)期保存內(nèi)存中,缺省值為0。

  • 回收池(Recycle pool):用來(lái)緩存很少重用的數(shù)據(jù),用完就釋放,缺省值為0。

     原來(lái)只有一個(gè)默認(rèn)池,所有數(shù)據(jù)都在這里緩存。這樣會(huì)產(chǎn)生一個(gè)問(wèn)題:大量很少重用的數(shù)據(jù)會(huì)把需重用的數(shù)據(jù)“擠出”緩沖區(qū),造成磁盤(pán)I/O增加,運(yùn)行速度下降。后來(lái)分出了保持池和回收池根據(jù)是否經(jīng)常重用來(lái)分別緩存數(shù)據(jù)。這三部分內(nèi)存池需要手動(dòng)確定大小,并且之間沒(méi)有共享。例如:保持池中已經(jīng)滿(mǎn)了,而回收池中還有大量空閑內(nèi)存,這時(shí)回收池的內(nèi)存不會(huì)分配給保持池,這些池一般被視為一種非常精細(xì)的低級(jí)調(diào)優(yōu)設(shè)備,只有所有其他調(diào)優(yōu)手段大多用過(guò)之后才應(yīng)考慮使用。

     在9i之前,數(shù)據(jù)緩沖區(qū)的大小是由DB_BLOCK_BUFFER確定,之后的版本中,是由參數(shù)DB_CACHE_SIZE及DB_nK_CACHE_SIZE確定。不同的表空間可以使用不同的塊大小,在創(chuàng)建表空間中加入?yún)?shù)BLOCKSIZE指定該表空間數(shù)據(jù)塊的大小,如果指定的是2k,則對(duì)應(yīng)的緩沖區(qū)大小為DB_2K_CACHE_SIZE參數(shù)的值,如果指定的是4k,則對(duì)應(yīng)的緩沖區(qū)大小為DB_4K_CACHE_SIZE參數(shù)的值,以此類(lèi)推。如果不指定BLOCKSIZE,則默認(rèn)為參數(shù)DB_BLOCK_SIZE的值,對(duì)應(yīng)的緩沖區(qū)大小是DB_CACHE_SIZE的值

重做日志緩沖區(qū)(Redo log buffer)

    用于存放日志條目,日志條目就是記錄對(duì)數(shù)據(jù)的改變。當(dāng)這塊區(qū)域用光時(shí),后臺(tái)進(jìn)程LGWR把日志條目寫(xiě)到磁盤(pán)上的聯(lián)機(jī)日志文件中。它由初始化參數(shù)log_buffer決定大小。同樣的道理下,日志緩沖區(qū)應(yīng)該稍微大點(diǎn),特別是有長(zhǎng)時(shí)間運(yùn)行的事務(wù)的時(shí)候,可以大量減少I(mǎi)/O。

數(shù)據(jù)寫(xiě)到重做日志文件之前在這里緩存,在以下情況中觸發(fā):

  1. 每隔3秒

  2. 緩存達(dá)到1MB或1/3滿(mǎn)時(shí)

  3. 用戶(hù)提交時(shí)

  4. 緩沖區(qū)的數(shù)據(jù)寫(xiě)入磁盤(pán)前

共享池(Shared pool)

用于存放SQL語(yǔ)句、PL/SQL代碼、數(shù)據(jù)字典、資源鎖和其他控制信息。它由初始化參數(shù)SHARED_POOL_SIZE控制其大小。它包含以下幾個(gè)緩沖區(qū):

1、 數(shù)據(jù)字典緩存(data dictionary cache),用于存儲(chǔ)經(jīng)常使用的數(shù)據(jù)字典信息。比如(表的定義、用戶(hù)名、口令、權(quán)限、數(shù)據(jù)庫(kù)的結(jié)構(gòu)等)。Oracle運(yùn)行過(guò)程中經(jīng)常訪問(wèn)該緩存以便解析SQL語(yǔ)句,確定操作的對(duì)象是否存在,是否具有權(quán)限等。如果不在數(shù)據(jù)字典緩存中,服務(wù)器進(jìn)程就從保存數(shù)據(jù)字典信息的數(shù)據(jù)文件中將其讀入到數(shù)據(jù)字典緩存中。數(shù)據(jù)字典緩存中保存的是一條一條的記錄(就像是內(nèi)存中的數(shù)據(jù)庫(kù)),而其他緩存區(qū)中保存的是數(shù)據(jù)塊信息。

2、 庫(kù)緩沖區(qū)(Library Cache): 庫(kù)緩存的目的就是保存最近解析過(guò)的SQL語(yǔ)句、PL/SQL過(guò)程和包。這樣一來(lái),Oracle在執(zhí)行一條SQL語(yǔ)句、一段PL/SQL 過(guò)程和包之前,首先在“庫(kù)緩存”中搜索,如果查到它們已經(jīng)解析過(guò)了,就利用“庫(kù)緩存”中解析結(jié)果和執(zhí)行計(jì)劃來(lái)執(zhí)行,而不必重新對(duì)它們進(jìn)行解析,顯著提高執(zhí)行速度和工作效率。

ORACLE將每一條SQL語(yǔ)句分解為可共享、不可共享的兩部分。

a) 共享SQL區(qū):存儲(chǔ)的是最近執(zhí)行的SQL語(yǔ)句、解析后的語(yǔ)法樹(shù)和優(yōu)化后的執(zhí)行計(jì)劃。這樣以后執(zhí)行相同的SQL語(yǔ)句就直接利用在共享SQL區(qū)中的緩存信息,不必重復(fù)語(yǔ)法解析了。Oracle在執(zhí)行一條新的SQL語(yǔ)句時(shí),會(huì)為它在共享SQL區(qū)中分配空間,分配的大小取決于SQL語(yǔ)句的復(fù)雜度。如果共享SQL區(qū)中沒(méi)有空閑空間,就利用LRU算法,釋放被占用的空間。

b) 私用SQL區(qū)(共享模式時(shí)):存儲(chǔ)的是在執(zhí)行SQL語(yǔ)句時(shí)與每個(gè)會(huì)話或用戶(hù)相關(guān)的私有信息。其他會(huì)話即使執(zhí)行相同的SQL語(yǔ)句也不會(huì)使用這些信息。比如(綁定變量、環(huán)境和會(huì)話參數(shù))。

3、 結(jié)果高速緩存:結(jié)果高速緩存包含 SQL 查詢(xún)結(jié)果高速緩存和 PL/SQL 函數(shù)結(jié)果高速緩存。此高速緩存用于存儲(chǔ) SQL 查詢(xún)或 PL/SQL 函數(shù)的結(jié)果,以加快其將來(lái)的執(zhí)行速度。

4、 鎖與其他控制結(jié)構(gòu):存儲(chǔ)ORACLE例程內(nèi)部操作所需的信息。比如(各種鎖、閂、寄存器值)。

大池(Large pool)

大池由初始化參數(shù)LARGE_POOL_SIZE確定大小,可以使用ALTER SYSTEM語(yǔ)句來(lái)動(dòng)態(tài)改變大池的大小,是可選項(xiàng),DBA可以根據(jù)實(shí)際業(yè)務(wù)需要來(lái)決定是否在SGA區(qū)中創(chuàng)建大池。如果沒(méi)有創(chuàng)建大池,則需要大量?jī)?nèi)存空間的操作將占用共享池的內(nèi)存, 將對(duì)SHARED POOL造成一定的性能影響,而LARGE POOL是起著這種功能隔離作用的一塊區(qū)域。

ORACLE 需要大量?jī)?nèi)存的操作有:

   A、數(shù)據(jù)庫(kù)備份和恢復(fù),如RMAN某些情況下用于磁盤(pán)IO緩沖區(qū)

   B、具有大量排序操作的SQL語(yǔ)句

   C、并行化的數(shù)據(jù)庫(kù)操作,存放進(jìn)程間的消息緩沖區(qū)

   D、共享服務(wù)器模式下UGA在大池中分配(如果設(shè)置了大池)

Java池(Java pool)

用于支持在數(shù)據(jù)庫(kù)中運(yùn)行java代碼,一般由java_pool_size控制

流池(Stream pool)

加強(qiáng)對(duì)流的支持,一般由stream_pool_size控制。流池(或者如果沒(méi)有配置流池,則是共享池中至多10%的空間)會(huì)用于緩存流進(jìn)程在數(shù)據(jù)庫(kù)間移動(dòng)/復(fù)制數(shù)據(jù)時(shí)使用的隊(duì)列消息

二、進(jìn)程全局區(qū)(Porcess Global Area, PGA)

Oracle內(nèi)存結(jié)構(gòu)SGA、PGA、UGA的示例分析

一個(gè)PGA是一塊獨(dú)占內(nèi)存區(qū)域,Oracle進(jìn)程以專(zhuān)有的方式用它來(lái)存放數(shù)據(jù)和控制信息。當(dāng)Oracle進(jìn)程啟動(dòng)時(shí),PGA也就由Oracle數(shù)據(jù)庫(kù)創(chuàng)建了。當(dāng)用戶(hù)進(jìn)程連接到數(shù)據(jù)庫(kù)并創(chuàng)建一個(gè)對(duì)應(yīng)的會(huì)話時(shí),Oracle服務(wù)進(jìn)程會(huì)為這個(gè)用戶(hù)專(zhuān)門(mén)設(shè)置一個(gè)PGA區(qū),用來(lái)存儲(chǔ)這個(gè)用戶(hù)會(huì)話的相關(guān)內(nèi)容。當(dāng)這個(gè)用戶(hù)會(huì)話終止時(shí),系統(tǒng)會(huì)自動(dòng)釋放這個(gè)PGA區(qū)所占用的內(nèi)存。這個(gè)PGA區(qū)對(duì)于數(shù)據(jù)庫(kù)的性能有比較大的影響,特別是對(duì)于排序操作的性能。所以,在必要的時(shí)候合理管理PGA區(qū),能夠在很大程度上提高數(shù)據(jù)庫(kù)的性能。

程序全局區(qū)主要包含排序區(qū)、會(huì)話區(qū)、堆棧區(qū)和游標(biāo)區(qū)四個(gè)部分的內(nèi)容,他們各司其職,完成用戶(hù)進(jìn)程與數(shù)據(jù)庫(kù)之間的會(huì)話。通常情況下,系統(tǒng)管理員主要關(guān)注的是排序區(qū),在必要時(shí)需要手工調(diào)整這個(gè)排序區(qū)的大小。另外需要主要的是,游標(biāo)區(qū)是一個(gè)動(dòng)態(tài)的區(qū)域,在游標(biāo)打開(kāi)時(shí)創(chuàng)建,關(guān)閉時(shí)釋放。故在數(shù)據(jù)庫(kù)開(kāi)發(fā)時(shí),不要頻繁的打開(kāi)和關(guān)閉游標(biāo)可以提高游標(biāo)操作的效率,改善數(shù)據(jù)庫(kù)的性能。其他分區(qū)的內(nèi)容管理員只需要了解其用途,日常的維護(hù)交給數(shù)據(jù)庫(kù)系統(tǒng)來(lái)完成即可。

1、 為排序設(shè)置合理的排序區(qū)大小。

當(dāng)用戶(hù)需要對(duì)某些數(shù)據(jù)進(jìn)行排序時(shí),數(shù)據(jù)庫(kù)是如何處理的呢?首先,數(shù)據(jù)庫(kù)系統(tǒng)會(huì)將需要排序的數(shù)據(jù)保存到PGA程 序緩存區(qū)中的一個(gè)排序區(qū)內(nèi)。然后再在這個(gè)排序區(qū)內(nèi)對(duì)這些數(shù)據(jù)進(jìn)行排序。如需要排序的數(shù)據(jù)有2M,那么排序區(qū)內(nèi)必須至少要有2M的空間來(lái)容納這些數(shù)據(jù)。然后 排序過(guò)程中又需要有2M的空間來(lái)保存排序后的數(shù)據(jù)。由于系統(tǒng)從內(nèi)存中讀取數(shù)據(jù)比從硬盤(pán)中讀取數(shù)據(jù)的速度要快幾千倍,為此如果這個(gè)數(shù)據(jù)排序與讀取的操作都能 夠在內(nèi)存中完成,無(wú)疑可以在很大程度上提高數(shù)據(jù)庫(kù)排序與訪問(wèn)的性能。如果這個(gè)排序的操作都能夠在內(nèi)存中完成,顯然這是很理想的。但是如果PGA區(qū) 中的排序區(qū)容量不夠,不能夠容納排序后的數(shù)據(jù),那會(huì)如何呢?此時(shí),系統(tǒng)會(huì)從硬盤(pán)中獲取一個(gè)空間,用來(lái)保存這需要排序的數(shù)據(jù)。此時(shí)排序的效率就會(huì)降低許多。 為此在數(shù)據(jù)庫(kù)管理中,如果發(fā)現(xiàn)用戶(hù)的很多操作都需要用到排序,那么為用戶(hù)設(shè)置比較大的排序區(qū),可以提高用戶(hù)訪問(wèn)數(shù)據(jù)的效率。

在Oracle數(shù)據(jù)庫(kù)中,這個(gè)排序區(qū)主要用來(lái)存放排序操作產(chǎn)生的臨時(shí)數(shù)據(jù)。一般來(lái)說(shuō),這個(gè)排序區(qū)的大小占據(jù)PGA程序緩存區(qū)的大部分空間,這是影響PGA區(qū)大小的主要因素。在小型應(yīng)用中,數(shù)據(jù)庫(kù)管理員可以直接采用其默認(rèn)的值。但是在一些大型的應(yīng)用中,或者需要進(jìn)行大量記錄排序操作的數(shù)據(jù)庫(kù)系統(tǒng)中,管理員可能需要手工調(diào)整這個(gè)排序區(qū)的大小,以提高排序的性能。如果系統(tǒng)管理員需要調(diào)整這個(gè)排序區(qū)大小的話,需要通過(guò)初始化參數(shù)SORT_AREA_SIZE來(lái)實(shí)現(xiàn)。為了提高數(shù)據(jù)訪問(wèn)與排序的性能,數(shù)據(jù)庫(kù)系統(tǒng)利用內(nèi)存比硬盤(pán)要快幾千倍的事實(shí),會(huì)將準(zhǔn)備排序的數(shù)據(jù)臨時(shí)存放到這個(gè)排序區(qū),并在排序區(qū)內(nèi)完成數(shù)據(jù)的排序。管理員需要牢記這個(gè)原則,并在適當(dāng)?shù)那闆r下調(diào)整排序區(qū)的大小,以提高數(shù)據(jù)訪問(wèn)與數(shù)據(jù)排序的性能。

2 會(huì)話區(qū)保存著用戶(hù)的權(quán)限等重要信息。

程序緩存區(qū)內(nèi)還包含著一個(gè)會(huì)話區(qū)。雖然絕大部分情況下,管理員不要維護(hù)這個(gè)會(huì)話區(qū),可以讓數(shù)據(jù)庫(kù)系統(tǒng)進(jìn)行 維護(hù)。但是,管理員還是需要了解一下這個(gè)會(huì)話區(qū)的作用。因?yàn)檫@個(gè)會(huì)話區(qū)直接關(guān)系著數(shù)據(jù)庫(kù)系統(tǒng)中數(shù)據(jù)的安全性。數(shù)據(jù)庫(kù)系統(tǒng)不僅是存放數(shù)據(jù)的一個(gè)很好的載體, 而且還提供了一個(gè)統(tǒng)一管理數(shù)據(jù)的平臺(tái),可以根據(jù)實(shí)際需要,為不同的用戶(hù)設(shè)置不同的訪問(wèn)權(quán)限。簡(jiǎn)單的說(shuō),在數(shù)據(jù)庫(kù)中可以控制用戶(hù)可以訪問(wèn)哪些數(shù)據(jù),從而提高 數(shù)據(jù)的安全性。

當(dāng)用戶(hù)進(jìn)程與數(shù)據(jù)庫(kù)建立會(huì)話時(shí),系統(tǒng)會(huì)將這個(gè)用戶(hù)的相關(guān)權(quán)限查詢(xún)出來(lái),然后保存在這個(gè)會(huì)話區(qū)內(nèi)。如此的話,用戶(hù)進(jìn)程在訪問(wèn)數(shù)據(jù)時(shí),系統(tǒng)就會(huì)核對(duì) 會(huì)話區(qū)內(nèi)的用戶(hù)權(quán)限信息,看看其是否具有相關(guān)的訪問(wèn)權(quán)限。由于系統(tǒng)將這個(gè)用戶(hù)的權(quán)限信息存放在內(nèi)存上,所以其核對(duì)用戶(hù)權(quán)限的速度非常的快。因?yàn)橄到y(tǒng)不用再 去硬盤(pán)中讀取數(shù)據(jù),直接從內(nèi)存中讀取。而從內(nèi)存讀取數(shù)據(jù)的效率要比硬盤(pán)上快幾千倍。

通常情況下,這個(gè)會(huì)話區(qū)內(nèi)保存了會(huì)話所具有的權(quán)限、角色、性能統(tǒng)計(jì)等信息。這個(gè)會(huì)話區(qū)一般都是由數(shù)據(jù)庫(kù)進(jìn)行自我維護(hù)的,系統(tǒng)管理員不用干預(yù)。

3 堆棧區(qū)保存變量信息。

有時(shí)候?yàn)榱颂岣逽QL語(yǔ)句的重用性,會(huì)在語(yǔ)句中使用綁定變量。簡(jiǎn)單的說(shuō),就是SQL語(yǔ)句可以接受用戶(hù)傳入的變量。從而用戶(hù)只需要輸入不同的變量 值,就可以滿(mǎn)足不同的查詢(xún)需求。如現(xiàn)在用戶(hù)需要查詢(xún)所有員工的信息。然后其又要查詢(xún)所有工齡在3年以上的員工等等。此時(shí)其實(shí)他們采用的是同一個(gè)SQL語(yǔ) 句,只是傳遞給系統(tǒng)的變量不同而已。這可以在很大程度上降低數(shù)據(jù)庫(kù)開(kāi)發(fā)的工作量。這個(gè)變量在Oracle數(shù)據(jù)庫(kù)系統(tǒng)中就叫做綁定變量。利用綁定變量可以加強(qiáng)與用戶(hù)的互動(dòng)性。另外在這個(gè)堆棧區(qū)內(nèi)還保存著會(huì)話變量、SQL語(yǔ)句運(yùn)行時(shí)的內(nèi)存結(jié)構(gòu)等重要的信息。

通常情況下,這個(gè)堆棧區(qū)跟上面講到的會(huì)話區(qū)一樣,都可以讓數(shù)據(jù)庫(kù)系統(tǒng)進(jìn)行自我維護(hù),而管理員不用參與到其中。這些分區(qū)的大小,也是系統(tǒng)根據(jù)實(shí)際情況來(lái)進(jìn)行自動(dòng)分配的。當(dāng)這個(gè)用戶(hù)會(huì)話結(jié)束時(shí),系統(tǒng)會(huì)自動(dòng)釋放這些區(qū)所占用的空間。

4 游標(biāo)區(qū)。

無(wú)論是SQLServer數(shù)據(jù)庫(kù)還是Oracle數(shù)據(jù)庫(kù)中,有時(shí)候都需要用到游標(biāo)技術(shù)。當(dāng)運(yùn)行使用游標(biāo)的語(yǔ)句時(shí),Oracle數(shù)據(jù)庫(kù)系統(tǒng)會(huì)在程序緩存區(qū)中間為其分配一塊區(qū)。這塊區(qū)域就叫做游標(biāo)區(qū)。通常情況下,游標(biāo)用來(lái)完成一些比較特殊的功能。而且一般來(lái)說(shuō),采用游標(biāo)的語(yǔ)句要比其他語(yǔ)句的執(zhí)行效率低一點(diǎn)。為此管理員在使用游標(biāo)的時(shí)候,還是需要慎重。

游標(biāo)區(qū)是一個(gè)動(dòng)態(tài)的區(qū)域。當(dāng)用戶(hù)執(zhí)行游標(biāo)語(yǔ)句時(shí),系統(tǒng)就會(huì)在這個(gè)游標(biāo)區(qū)內(nèi)創(chuàng)建一個(gè)區(qū)域。當(dāng)關(guān)閉游標(biāo)時(shí),這個(gè)區(qū)域就會(huì)被釋放。這創(chuàng)建與釋放,需要 站用一定的系統(tǒng)資源,花費(fèi)一定的時(shí)間。為此在使用游標(biāo)時(shí),如果頻繁的打開(kāi)和關(guān)閉游標(biāo),就會(huì)降低語(yǔ)句的執(zhí)行性能。所以筆者建議,在寫(xiě)語(yǔ)句時(shí),如果真的有必要 使用游標(biāo)技術(shù)時(shí),則要注意游標(biāo)不要頻繁的打開(kāi)和關(guān)閉。

另外在Oracle數(shù)據(jù)庫(kù)中,還可以通過(guò)限制游標(biāo)的數(shù)量來(lái)提高數(shù)據(jù)庫(kù)的性能。如在數(shù)據(jù)庫(kù)系統(tǒng)中有一個(gè)初始化參數(shù)OPEN_CURSORS。管理員可以根據(jù)實(shí)際的需要,來(lái)設(shè)置這個(gè)參數(shù),控制用戶(hù)能夠同時(shí)打開(kāi)游標(biāo)的數(shù)目。不過(guò)需要注意的是,在確實(shí)需要才有游標(biāo)的情況下,如果硬件資源能夠支持的話,那么就需要放寬這個(gè)限制。這可以避免用戶(hù)進(jìn)程頻繁的打開(kāi)和關(guān)閉游標(biāo)。因?yàn)轭l繁的打開(kāi)和關(guān)閉游標(biāo)這對(duì)游標(biāo)的操作是不利的,會(huì)影響數(shù)據(jù)庫(kù)的性能。

三、用戶(hù)全局區(qū)  (User Global Area, UGA)

專(zhuān)用服務(wù)器模式下,進(jìn)程和會(huì)話是一對(duì)一的關(guān)系,UGA被包含在PGA中,在聯(lián)機(jī)服務(wù)器模式下,進(jìn)程和會(huì)話是一對(duì)多的關(guān)系,所以UGA就不再屬于 PGA了,而會(huì)在大型池(Large Pool)中分配。但如果從大型池中分配失敗,如大型池太小,或是根本沒(méi)有設(shè)置大型池,則從共享池(Shared Pool)中分配。

關(guān)于“Oracle內(nèi)存結(jié)構(gòu)SGA、PGA、UGA的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI