oracle中sql語句執行的過程

共享內存的幾大內存

1)shared pool(共享池):
主要作用是提高SQL語句以及PL/SQL語句的執行效率,緩存執行過的SQL語句,執行計劃;PL/SQL語句的代碼塊、執行碼等(該部分稱爲library cache);以及在編譯SQL, PL/SQL語句是參照的數據字典信息(該部分稱爲dictionary cache或row cache)。是SGA中最重要的部分之一。
2)database buffer cache(數據庫緩衝區):
主要作用是緩存曾經讀取過的數據塊,Oracle數據庫中對數據的所有修改操作都是在buffer cache中進行的。因爲所有的操作都必須先將物理文件上的數據塊讀取到buffer cache中,然後才能進行各種操作。buffer cache是SGA中最大的內存區域,也是SGA中最重要的部分之一。
3)redo log buffer(重做日誌緩衝區):
緩存生成的redo log記錄,日誌寫後臺進程會將log buffer中的記錄寫到磁盤中。也是SGA中最重要的部分之一。
4)Large pool(大池):
可選的內存池,其主要作用是分擔shared pool的壓力。某些情況,比如備份恢復,如果沒有分配Large pool,則會從shared pool中分配內存,這會增加shared pool的負擔。
5)Java pool(Java池):
用於Java程序使用。
6)stream pool(流池):
數據庫在流工作是使用的內存區域。

sql執行過程

server process承載sql--->去libray cache尋找之前的執行計劃

1.客戶端輸入一條sql語句。

2.sql語句通過網絡傳輸到oracle數據庫實例。

3.server process接收sql語句。

*oracle實例將sql語句解析成sql執行計劃,然後才能執行
*解析的時候會消耗I/O、CPU,查詢執行的sql涉及到的視圖等系列資源有沒有權限,或者是否存在

 

4.在shared pool中對數據做修改(緩存sql語句和解析執行計劃)

執行計劃將數據從DBF文件,緩存到buffer Cache中,由DBWriter進程寫入DBF文件,DBWriter進程有自己的寫入機制。

5.server process對錶的修改,產生日誌,日誌緩存在redo buffer中,由LogWriter進程寫入redo.log文件中,LogWriter進程有自己的寫入機制

這就是,在用戶端使用server process, 後臺進程寫入數據,用戶關注server process的處理速度。

 

shared pool在sql執行中的作用:

將常用的sql執行計劃緩存在SP中,減少解析的步驟,有的話在SP中直接使用,沒有的話,新解析新生成,這一系列動作由server process進程去做。

buffer Cache:

減少I/O的使用率,涉及到一個概念,命中率。

sql語句的硬解析

shard pool大體分爲3部分

1.free空間。

2.library cache的空間。

3.字典緩存(row cache),緩存oracle自身的信息。

--查詢shard pool 主要組成的cache size

select * from v$sgastat a where a.NAME = 'library cache';
select * from v$sgastat a where a.pool = 'shared pool' and a.NAME = 'free memory';
select * from v$sgastat a where a.NAME = 'row cache';

sql語句的解析類型

軟解析

硬解析

執行計劃在librarycache中找不到,發生硬解析,比較消耗資源。

--查詢軟解析和硬解析的次數,軟硬解析的具體情況
--我們期望軟解析多,硬解析多的時候需要引起注意
select name,value from v$sysstat where name like 'parse%'

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章