您好,登錄后才能下訂單哦!
安裝oracle軟件----創建數據庫----在數據庫中創建表----表里存儲信息---這些表文件需要存儲在物理硬盤上面。
假如有一個用戶(這個用戶可以是遠程用戶,也可以是本地的,也可以是一個應用程序)連接到oracle數據庫上面,用戶是不能直接連接在硬盤上存儲的數據文件,所以在oracle中要運行一個實例,實例并不是保存在硬盤上面的,實例是內存的一部分,而庫和表文件是存放在硬盤上面的,用戶不能直接訪問庫里面的數據,只能訪問實例,實例是一個特殊的內存塊,只有實例能和數據庫直接通信,在咱們的實驗環境中實例和數據庫是在同一臺機器上,我們稱之為單實例環境,對于用戶而言所有的操作都是在實例中完成的,oracle為實例劃分了一個內存塊,這個內存塊我們稱之為SGA,其實oracle實例啟動的時候,將會分配一個SGA系統全局區并啟動一些oracle的后臺進程(守護進程)。
SGA核心組件介紹:
在oracle中內存=SGA+PGA
一個實例只能有一個SGA,所有的服務器進程和后臺進程都共享一個SGA
PGA:
我們先看一下一個select語句是如何被執行的?
如果hr用戶寫了一個select * from scott.emp;
第一步:先做編譯,編譯包含了語法的檢查和語義的檢查。
第二步:如果編譯沒有問題會進入shared pool(共享池 )中,而shared pool 是由library cache和data dictionary cache(數據字典緩存)組成。Sql語句第一時間會進入librarycache中,即library cache中會存放被編譯過的正確的sql語句,僅僅是sql語句而已。library cache中沒有緩存的sql語句需要進行硬解析(即需要耗費設備的I/0資源從硬盤讀取)。假設library cache中有這個sql語句,就不需要做硬解析,接著會查 data dictionary cache。data dictionary cache中緩存了權限和對象數據及屬性,所有data dictionary cache檢查hr用戶是否對scott.emp表是否具有訪問權限,如果有權限繼續往下執行,如果沒有權限,直接給hr用戶返回一個結果。如果一條語句從來都沒有被執行過,這條語句首先被緩存在share pool中的library cache中,下一次被執行的時候直接從share pool中取sql語句。存放sql語句也需要占用空間,share pool的空間也是有限的,為了防止share pool空間不夠用,采用先進先出的規則即后執行的sql語句會覆蓋先執行的sql語句來釋放空間,當然share pool的空間越大越好。
我們通過企業管理器來查看share pool的相關信息
在sql plus中可以用以下方式查看,圖中“0”表示自動化管理
可以從v$sgainfo中查看shared pool size
SQL> select name,bytes/1024/1024||'MB' from v$sgainfo;
Shared Pool Size
256MB
Large Pool Size
16MB
Java Pool Size
16MB
第三步:data buffer cache現在hr用戶可以訪問scott.emp表了,databuffer cache的作用就是從磁盤或存儲中將數據塊調入內存,緩存在buffer cache中。
舉例:
用戶第一次訪問scott.emp的內容
SQL> set timing on
SQL> select * from scott.emp;第一次執行sql語句
已選擇14行。
已用時間: 00: 00: 00.05
SQL> /再次執行上一條命令所用的時間為00: 00: 00.00
已選擇14行。
已用時間: 00: 00: 00.00
總結:buffer cache緩存數據本身,library cache緩存sql語句本身。
可以通過show parameter db_cache_size查看buffer cache的大小
第四步:redo log buffer<重做日志緩沖區>當用戶執行insert,update,delete,create,alter等操作后,數據發生了變化,這些變化了的數據寫入數據緩沖區(buffer cache)之前,先寫入重做日志緩沖區,同時變化之前的數據也放入重做日志緩存中,這樣做,是為了保證在數據恢復時oracle就知道哪些事務需要提交,哪些事務需要撤回。
如果對此文有什么問題的話,請加下面微信一起探討
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。