Oracle內存結構
Oracle內存結構是Oracle數據庫重要組成部分,是 oracle 數據庫重要的信息緩存和共享區域,和Oracle后臺進程一起組成Oracle實例。Oracle用戶的所有操作都會在內存當中進行一系列操作,然后再交給數據庫后臺進程,最后把數據持久化到相應的物理文件中進行保存。
Oracle內存是在數據庫啟動,或者是實例啟動時進行分配的。Oracle內存的管理是由Oracle數據庫本身進行管理的。我們常見的一些數據庫性能有一大部分是由于隨著數據庫業務的發展,之前配置的Oracle內存不夠合理或者太少,從而導致的數據庫的性能下降。
Oracle內存結構主要有軟件代碼區(SCA)、系統全局區(SGA)、程序全局區(PGA)組成。
軟件代碼區(SCA)
Oracle軟件代碼區(SCA)主要是用于保存正在執行的和需要執行的代碼,Oracle代碼區是所有Oracle用戶和實例都可以共享使用的。它的大小一般在數據庫安裝部署后SCA的內存大小就不會變化,并且SCA代碼區只能進行讀。
系統全局區(SGA)
系統全局區是共享內存結構,它是由Oracle系統進行分配的,主要包含Oracle實例和控制相關信息,用于提供查詢性能,允許大量并發的數據庫活動。當Oracle啟動時,會分配制定的SGA。SGA中的數據供所有的服務器進程和后臺進程共享,因此SGA 又常稱為共享全局區。
SGA主要分為數據庫緩沖區高速緩存、重做日志緩沖區、共享池、數據字典高速緩存和其它信息區。
數據庫高速緩存:指的?是從最近從數據文件中檢索出來的數據,供所有用戶共享使用。類似保存數據文件的一個副本,減少用戶直接讀取數據和操作數據文件的次數。提高讀取和操作的速度。當用戶要操作數據庫中的數據時,Oracle使用高效的LRU算法,先由服務器進程將數據從磁盤的數據文件中讀取到數據高速緩沖區中,然后進行處理。最后用戶在緩沖區中處理的結果,最終會由數據庫寫入進程DBWR寫到對應的數據文件中進行持久化。
重做日志緩沖區:指的是用于記錄用戶對數據庫的修改操作生成的操作記錄。通過重做日志的概念我們可以了解到數據修改的記錄并不是直接寫入到重做日志文件中,而是先被寫入到重做日志緩沖區,在特定條件下,才通過LGWR日志寫入進程寫到重做日志當中。
共享池:共享池主要是保存最近執行過的SQL語句、PL/SQL程序或數據字典緩存信息。主要用于提高SQL語句的解析效率,不需要每次執行過的語句或者程序塊需要重新解析、編譯再執行。
數據字典高速緩存:指的是保存數據庫的對象信息、數據庫結構信息等,當用戶訪問數據庫時,可以快速的從數據字典緩存區中獲取到常用的數據字典的信息,比如對象是否存在,用戶對應的相關權限信息等等。
SGA是占用Oracle內存最大的一個區域,同時也是最影響Oracle性能的主要因素。我們可以通過數據字典v$sga查詢數據庫中SGA內存的相關信息,如下:
程序全局區(PGA)
PGA顧名思義程序全局區,就是Oracle進程生成的同時會為它分配一個相應的內存區,該內存區就叫做PGA。因此PGA是一個私有的內存區,不能進行共享。所有的后臺進程都會分配到自己的PGA區。它是隨著后臺進程的啟動而分配,隨著進程的終止而釋放。
這里就會常用到的幾個程序全局區,比如:
1、在進行復雜數據關聯排序時,會用到排序區來存放排序操作所產生的臨時數據。
2、PL/SQL程序塊中使用到游標時,會用到游標信息區來存放游標中的數據集。
3、用戶登錄后,會利用會話信息區來保存用戶對應的會話所具有的權限或相關性能統計信息。
4、堆棧區:在PL/SQL程序塊中,我們會經常使用到變量或者會話變量,這些會話中的變量信息會保存在堆棧區中。