decose oracle_oracle 内存与进程
shared pool
1 庫緩存 library cache
游標(biāo)和pl/sql游標(biāo)不是一個(gè)概念
hashset
在找bucket
根據(jù)shared_pool_size 指定的尺寸,可以計(jì)算出bucket個(gè)數(shù)
每一個(gè)bucket都有一個(gè)對(duì)象制定
2 數(shù)據(jù)字典緩沖
內(nèi)存塊組成 chunk
chunk是shared pool 中內(nèi)存分配的最小單元,在內(nèi)存中是連續(xù)的
chunk分類
1. free 2.recreatable 3.freeable 4. perm
一條sql語句
1.進(jìn)入共享池 shared pool
2.轉(zhuǎn)為為ascii值
3.對(duì)ascii 進(jìn)行hash運(yùn)算,得到一個(gè)數(shù)值(對(duì)應(yīng)的bucket的號(hào)碼)
對(duì)bucket進(jìn)行遍歷,遍歷bucket 的時(shí)候,
有:直接返回可以使用的sql
沒有:獲取shared pool latch,硬解析開始。
硬解析的過程:
1 對(duì)sql語句進(jìn)行 語法檢查, 如果有錯(cuò),馬上退出。
select * form emps
2 檢查sql語句涉及到的對(duì)象是否存在
3 檢查權(quán)限
4 獲取free bucket中當(dāng)空的chunk以及相關(guān)的latch
5 通過優(yōu)化器,創(chuàng)建執(zhí)行計(jì)劃,最優(yōu)的。
6 執(zhí)行計(jì)劃以及sql文本進(jìn)入 library cache,在解析的過程中,
進(jìn)程一直持有l(wèi)ibrary cache的latch,一直到硬解析結(jié)束。
軟解析:
1.
A select * from emp;
B select * from emp; 省略5 ?6
2.
A select * from emp;
select * from emp;省略2 4 5 6
4.將對(duì)象放進(jìn)對(duì)應(yīng)的bucket中
SQL 語句解析過程
select * from emp where empno=7369
硬解析
軟解析
latch 閂鎖
1.latch 是保護(hù) 鏈的
2.簡(jiǎn)單 只有兩個(gè)狀態(tài) 0 1 內(nèi)存鎖
latch 是保護(hù) 鏈的,不是保護(hù)數(shù)據(jù)的
要訪問修改 鏈,首先有鏈的latch
latch爭(zhēng)用
例子:
2 cpu
A 進(jìn)程
B 進(jìn)程
C 進(jìn)程
A進(jìn)程 獲取到CPU時(shí)間片 讀取鏈 需要獲取latch 將0改為1
B進(jìn)程 獲取到另一個(gè)CPU,B去讀取這個(gè)鏈
B有兩種選擇:
1 馬上退出CPU 讓其他進(jìn)程工作 ====》 C進(jìn)程進(jìn)入CPU
2 B進(jìn)程知道這時(shí)一個(gè)閂鎖 latch,知道很快就被釋放,在CPU等會(huì)。閂自旋 空轉(zhuǎn)CPU。
嘗試3次,如果嘗試3次之后,還沒有等到latch,退出CPU.
發(fā)現(xiàn)shared pool latch 被大量爭(zhēng)用,說明有 大量的sql語句, 需要被硬解析,
select * from emp where empno=7369
select ?* from emp where empno=7369
父子游標(biāo)
一條sql被解析,被解析后,放到庫緩存中。產(chǎn)生父游標(biāo)和子游標(biāo)
父:sql語句 ? ? ? 比較小
子:執(zhí)行計(jì)劃 ? ? ?比較大
select * from emp where id=1;
select * from emp where id=10000;
記住:
動(dòng)態(tài)性能視圖:
v$sql 每一行 ?對(duì)應(yīng)一個(gè)子游標(biāo)
v$sqlarea 每一行 對(duì)應(yīng)一個(gè)父游標(biāo)
游標(biāo)在硬解析結(jié)束后
當(dāng)session 打開游標(biāo)以后,就會(huì)鎖定父游標(biāo)。
oracle 根據(jù)父游標(biāo) 構(gòu)建子游標(biāo) reload
1 顯示shared pool 中的自由空間
desc v$sgastat
select * from v$sgastat where name='free memory'
show parameter shared_pool_size;
alter system set shared_pool_size=100M;
select * from v$librarycache
select * from v$sysstat where name='parse count(hard)'
shared_pool 的sql命中率
1 hash value
2 有的話 軟解析
3 沒有 硬解析
4
查詢命中率
select ?namespace,pins,pinhists,reloads,invalidations from v$librarycache ;
select sum(pinhits)/sum(pins) from v$libraryccache
execute dbms_stats.gather_table_stats()
分享到:
2011-09-30 08:59
瀏覽 960
分類:數(shù)據(jù)庫
評(píng)論
總結(jié)
以上是生活随笔為你收集整理的decose oracle_oracle 内存与进程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python中提供怎样的内置库、可以用来
- 下一篇: unity 继承了 获取_获取继承链