oracle存储查询出来的值_技术分享|浅析ORACLE数据库物理体系结构及其对应优化策略...
張志國(guó)
合肥科技研發(fā)中心
Oracle數(shù)據(jù)庫服務(wù)器有兩個(gè)主要的組成部分:數(shù)據(jù)庫和實(shí)例(instance)。Oracle數(shù)據(jù)庫用于存儲(chǔ)和檢索信息,是數(shù)據(jù)的集合。Oracle實(shí)例是指數(shù)據(jù)庫服務(wù)器的內(nèi)存及相關(guān)處理程序。
正因?yàn)槿绱?#xff0c;我們一般才會(huì)說關(guān)閉和啟動(dòng)實(shí)例,加載卸載數(shù)據(jù)庫,就是這個(gè)道理。
從實(shí)例和數(shù)據(jù)庫的概念上來看,我們能知道,實(shí)例是暫時(shí)的,它不過是一組邏輯劃分的內(nèi)存結(jié)構(gòu)和進(jìn)程結(jié)構(gòu),會(huì)隨著數(shù)據(jù)庫的關(guān)閉而消失,而數(shù)據(jù)庫其實(shí)就是一堆物理文件(控制文件,數(shù)據(jù)文件,日志文件等等),它是永久存在的(除非磁盤損壞)。數(shù)據(jù)庫和實(shí)例通常是一對(duì)一的,這種結(jié)構(gòu)我們稱為單實(shí)例體系結(jié)構(gòu)。當(dāng)然還有一些復(fù)雜的分布式的結(jié)構(gòu),一個(gè)數(shù)據(jù)庫可以對(duì)多個(gè)實(shí)例,像Oracle的RAC(有興趣的童鞋可以了解下)。
一、Oracle數(shù)據(jù)庫的物理體系結(jié)構(gòu)
如上圖,我們可知:
① Oracle由實(shí)例instance和數(shù)據(jù)庫database組成。
②?實(shí)例是由一個(gè)共享內(nèi)存區(qū)SGA (G=Global)和一系列后臺(tái)進(jìn)程組成。SGA劃分為共享池、數(shù)據(jù)緩沖區(qū)和日志緩沖區(qū)三類。后臺(tái)進(jìn)程包括DBWR、LGWR、CKRT、ARCH等。
③?數(shù)據(jù)庫由數(shù)據(jù)文件、參數(shù)文件、日志文件、控制文件、歸檔日志等組成,其中歸檔日志最終會(huì)被轉(zhuǎn)移到存儲(chǔ)介質(zhì)中,用于備份和恢復(fù)數(shù)據(jù)使用。
④ PGA也是一塊開辟出來的內(nèi)存區(qū),和SGA區(qū)別在于,PGA是私有的。作用主要包括:保存用戶的連接信息,如會(huì)話和綁定變量,保存用戶權(quán)限等信息,承擔(dān)一部分(排序尺寸太大的話,超出的部分放在臨時(shí)表空間進(jìn)行)排序功能。
二、由物理體系結(jié)構(gòu)探查SQL執(zhí)行步驟
一條查詢語句:SELECT T.OBJECT_ID FROM DBA_OBJECTS T WHERE T.OBJECT_ID = 12;Oracle會(huì)執(zhí)行如下步驟:
(1)這個(gè)時(shí)候先完成PGA的3步驟中的頭2步:保存會(huì)話信息,用戶權(quán)限信息,然后將sql語句hash出一條hash值。
(2)帶著hash值,sql進(jìn)入了第二個(gè)區(qū)域:共享池,在這里首先查找是否有同樣的hash值。如果沒有,那么就比較辛苦:首先查詢語法是否正確,然后查詢語義(表和字段有沒有寫錯(cuò))是否正確,是否有權(quán)限等,確認(rèn)完這些,將hash值存儲(chǔ)下來。接下來進(jìn)行硬解析,經(jīng)過優(yōu)化器分析以后Oracle會(huì)選擇一個(gè)低成本的執(zhí)行計(jì)劃。
(3)帶著執(zhí)行計(jì)劃的sql接下來進(jìn)入第三個(gè)區(qū)域:數(shù)據(jù)緩存區(qū),去獲得需要的數(shù)據(jù),如果查到該數(shù)據(jù),則返回給sql帶回到PGA。如果沒有,就要大費(fèi)周章地去磁盤(增大IO降低速度)里面查找。查找的方式就是按照?qǐng)?zhí)行計(jì)劃來。讀出來的數(shù)據(jù)會(huì)被放回?cái)?shù)據(jù)緩存區(qū)和PGA。
但是,執(zhí)行同樣一條查詢語句,第二次的時(shí)間明顯變少了。第一次執(zhí)行耗時(shí):2.547S,第二次執(zhí)行耗時(shí):0.141S。前后兩次執(zhí)行同一條語句,第二次比第一次少很多時(shí)間。原因是第二次少做了一些事情:
(1)因?yàn)闀?huì)話沒有斷開,所以不需要再去數(shù)據(jù)庫讀取權(quán)限和用戶信息,少了很多物理讀。
(2)因?yàn)槭堑诙螆?zhí)行同一條語句,所以SGA的共享池里已經(jīng)保存了相對(duì)應(yīng)的hash值,比照一樣之后,不需要做語法語義的驗(yàn)證,也不需要做硬解析獲得優(yōu)化的執(zhí)行計(jì)劃,只要把已經(jīng)解析好的執(zhí)行計(jì)劃拿來用就好。
(3)數(shù)據(jù)被取到SGA的數(shù)據(jù)緩存區(qū)里面,也不需要去硬盤讀。
三、由物理體系得到優(yōu)化方案
由以上的訪問步驟可以知道,只要理解好數(shù)據(jù)庫的物理結(jié)構(gòu),就可以得到一些優(yōu)化思路:采用綁定變量的方式,可以避免多次硬解析。
優(yōu)化前:
create table t (x int);
create or replace procedure proc1
as
begin
for i in 1..100000
loop
????????execute immediate
????????‘insert into t values(‘||i||’)’;
commit;
end loop;
end;
/
以上為存儲(chǔ)過程的定義
?exec proc1; 執(zhí)行耗時(shí)42.87s;
優(yōu)化后:采用綁定變量方式,減少解析時(shí)間
drop table t purge;
create table t (x int);
create or replace procedure proc2
as
begin
for i in 1..100000
loop
????????execute immediate
????????'insert into t values( :x )' using i;
commit;
end loop;
end;
/
以上為存儲(chǔ)過程的定義
?exec proc2; 執(zhí)行耗時(shí)8.41s
四、小? 結(jié)
因?yàn)镺racle有緩存的功能,如果有緩存SQL相應(yīng)的連接信息、權(quán)限信息、執(zhí)行計(jì)劃、數(shù)據(jù)等,不用去磁盤上讀取,可以減少物理讀。所以執(zhí)行相同的SQL,第二次比第一次快。另外,采用綁定變量的方式,可以避免多次硬解析的操作,節(jié)約執(zhí)行時(shí)間,也可以達(dá)到優(yōu)化的效果。
總結(jié)
以上是生活随笔為你收集整理的oracle存储查询出来的值_技术分享|浅析ORACLE数据库物理体系结构及其对应优化策略...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql 一分钟内_MySQL语句需要
- 下一篇: linux cmake编译源码,linu