oracle数据缓冲区作用,Oracle内存结构(02)--缓冲区
用戶提交一個(gè)新SQL語(yǔ)句時(shí),Oracle會(huì)分析(parse)該句SQL(硬解析),這個(gè)過(guò)程將耗費(fèi)相對(duì)較多的時(shí)間。分析完畢后,oracle會(huì)將該SQL的分析結(jié)果給保存在Library Cache中,當(dāng)數(shù)據(jù)庫(kù)再次執(zhí)行該SQL時(shí),oracle將直接取第一次分析結(jié)果而不再重新解析,從而減少運(yùn)行時(shí)間。
Library Cache四個(gè)組成部分:
共享SQL區(qū):保存語(yǔ)句文本,編譯后的語(yǔ)法分析樹(shù)及執(zhí)行計(jì)劃。
私有SQL區(qū):保存語(yǔ)句中的變量值。
共享PL/SQL區(qū):保存PL/SQL語(yǔ)句。
控制結(jié)構(gòu)區(qū):保存鎖等控制信息。
查看library cache的大小:
SQL> select sum(sharable_mem) from v$db_object_cache;
測(cè)試library cache的作用:
SQL> set timing on
SQL> select count(*) from dba_objects;
COUNT(*)
----------
49809
Elapsed: 00:00:00.20
SQL> select count(*) from dba_objects;
COUNT(*)
----------
49809
Elapsed: 00:00:00.10
查看保存在library cache中保存的已分析的SQL語(yǔ)句:
SQL> select * from v$sqltext where sql_text like '%dba_object%';
SQL> select sql_text from v$sqlarea where sql_text like '%dba_object%';
綁定變量:
綁定變量的使用:
SQL> select object_id,object_name from dba_objects where object_id=5100;
SQL> select object_id,object_name from dba_objects where object_id=5101;
SQL> variable i number;??????????? #定義變量。
SQL> exec :i:=5100;???????????????? #給變量賦值。
SQL> print :i????????????????????????????#打印變量值。
SQL> select object_id,object_name from dba_objects where object_id=:i;
SQL> exec :i:=5101;
SQL> select object_id,object_name from dba_objects where object_id=:i;
SQL> select sql_text,parse_calls from v$sqlarea where sql_text like '%object_id%';
SQL_TEXT
--------------------------------------------------------------------------------
PARSE_CALLS
-----------
select object_id,object_name from dba_objects where object_id=:i??????????????#緩存的sql語(yǔ)句。
2??????????????????????????????????????????????????????????????????????????????????????????????? #被調(diào)用次數(shù)。
select sql_text,parse_calls from v$sqlarea where sql_text like '%object_id%'
1
select object_id,object_name from dba_objects where object_id=5100
1
select object_id,object_name from dba_objects where object_id=5101
1
#可見(jiàn)使用綁定變量可以增加sql語(yǔ)句緩存的命中率,減少硬解析所帶來(lái)的性能損失。
Data Dictionary Cache
專供數(shù)據(jù)字典使用的緩沖區(qū),SQL語(yǔ)句分析過(guò)程中需要大量訪問(wèn)系統(tǒng)數(shù)據(jù)字典(從磁盤數(shù)據(jù)文件中訪問(wèn)數(shù)據(jù)字典成為recursive calls),即可使用該緩存區(qū)專門存放數(shù)據(jù)字典,從而避免過(guò)多的recursive calls所帶來(lái)的性能損失。
數(shù)據(jù)字典是關(guān)于數(shù)據(jù)庫(kù)的參考信息、數(shù)據(jù)庫(kù)的結(jié)構(gòu)信息、數(shù)據(jù)庫(kù)的用戶信息等各類信息描述的一組表和視圖的集合。
數(shù)據(jù)字典用于描述所有數(shù)據(jù)庫(kù)對(duì)象的數(shù)據(jù)庫(kù)對(duì)象的集合。
SQL> select * from v$fixed_table;?? #查看系統(tǒng)中所有的動(dòng)態(tài)表。
SQL> select * from dict;????????? #查看數(shù)據(jù)字典。
SQL> select object_name,object_type,created from dba_objects where object_name in ('TEST','T1');????????????????????? #從數(shù)據(jù)字典的dba_objects表中查詢指定數(shù)據(jù)庫(kù)對(duì)象的相關(guān)描述。
SQL> select * from dba_users;?????????#從數(shù)據(jù)字典dba_users表中查詢數(shù)據(jù)庫(kù)用戶的相關(guān)描述。
SQL> select * from dba_data_files;? #從數(shù)據(jù)字典dba_data_files表中查詢所有數(shù)據(jù)庫(kù)文件的相關(guān)描述。
數(shù)據(jù)字典中表的分類:
靜態(tài)表:對(duì)各類數(shù)據(jù)庫(kù)對(duì)象的各類屬性的描述,常見(jiàn)的有下面三類字母開(kāi)頭:
dba_*:存儲(chǔ)當(dāng)前數(shù)據(jù)庫(kù)中所有數(shù)據(jù)庫(kù)對(duì)象的描述
all_*:存儲(chǔ)當(dāng)前用戶能夠訪問(wèn)的數(shù)據(jù)對(duì)象的描述
user_*:存儲(chǔ)當(dāng)前用戶所擁有的數(shù)據(jù)庫(kù)對(duì)象的描述
動(dòng)態(tài)表:不斷動(dòng)態(tài)更新以反映數(shù)據(jù)庫(kù)當(dāng)前運(yùn)行狀況,常見(jiàn)以“v$”開(kāi)頭。
查看data dictionary cache的大小:
SQL> select sum(sharable_mem) from v$sqlarea;
測(cè)試的data dictionary cache作用:
SQL> set autot on stat??????????????????????????????? #打開(kāi)統(tǒng)計(jì)信息顯示。
SQL> select count(*) from dba_source;???????????? #查詢一張表。
COUNT(*)
----------
292167
Statistics
----------------------------------------------------------
312? recursive calls?????????????????????????????????? #recursive calls?次數(shù)。????????? 0? db block gets
1998? consistent gets
698? physical reads
0? redo size
413? bytes sent via SQL*Net to client
385? bytes received via SQL*Net from client
2? SQL*Net roundtrips to/from client
6? sorts (memory)
0? sorts (disk)
1? rows processed
SQL> select count(*) from dba_source;???????????? #再次查同一張表。
COUNT(*)
----------
292167
Statistics
----------------------------------------------------------
0? recursive calls????????????????????????????????? #可見(jiàn)recursive calls?次數(shù)明顯減少。
0? db block gets
1927? consistent gets
0? physical reads
0? redo size
413? bytes sent via SQL*Net to client
385? bytes received via SQL*Net from client
2? SQL*Net roundtrips to/from client
0? sorts (memory)
0? sorts (disk)
1? rows processed
3、Large pool
large_pool用來(lái)分配大內(nèi)存塊,來(lái)處理比shared pool更大的內(nèi)存,實(shí)際常用做備用池,用以緩解oracle對(duì)共享池和PGA區(qū)內(nèi)存的使用壓力。使用large pool的對(duì)象主要有:
多線程服務(wù)器MTS:在SGA的large_pool中分配UGA;
語(yǔ)句的并行查詢Parallel Exection:用作進(jìn)程間的消息緩沖器;
恢復(fù)管理器RMAN:備份時(shí)用作磁盤I/O緩沖區(qū)。
SQL> show parameter large_pool???????????? #查看large_pool參數(shù)默認(rèn)值,為0則應(yīng)表示ASMM已開(kāi)啟。
SQL> select pool,sum(bytes) from v$sgastat group by pool;?? #?查看large_pool當(dāng)前運(yùn)行期間ASMM實(shí)際分配大小。
4、Java pool
oracle在內(nèi)核中加入了對(duì)java的支持。該緩沖區(qū)轉(zhuǎn)為java開(kāi)發(fā)和應(yīng)用所設(shè),若不用java程序則沒(méi)必要改變?cè)摼彌_區(qū)的默認(rèn)大小。
SQL> show parameter java_pool???????????? #查看java_pool參數(shù)默認(rèn)值,為0則應(yīng)表示ASMM已開(kāi)啟。
SQL> select pool,sum(bytes) from v$sgastat group by pool;?? #?查看java_pool當(dāng)前運(yùn)行期間ASMM實(shí)際分配大小。
5、redo_log_buffer
對(duì)數(shù)據(jù)庫(kù)的任何修改都按順序被記錄在該緩沖區(qū),然后由LGWR進(jìn)程根據(jù)條件將更改信息批量寫入磁盤上的redo log文件,以節(jié)省磁盤IO。該緩存不參與ASMM的動(dòng)態(tài)管理,不能自動(dòng)調(diào)整大小。
SQL> select name,bytes from v$sgastat where name='log_buffer';?? #查看log_buffer實(shí)際大小。
SQL> show parameter log_buffer????????????? #查看log_buffer預(yù)設(shè)大小。
SQL> alter system set log_buffer=2000000 scope=spfile;???? #手工修改log_buffer大小,需重啟。
6、streams_buffer
用于對(duì)流復(fù)制進(jìn)行緩沖。
SQL> show parameter streams_pool???? #查看streams_pool參數(shù)默認(rèn)值。
總結(jié)
以上是生活随笔為你收集整理的oracle数据缓冲区作用,Oracle内存结构(02)--缓冲区的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 用神奇粉末减肥是真的吗
- 下一篇: 医院里的减肥方法有哪些