日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[转]Oracle DB管理内存

發布時間:2023/12/2 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [转]Oracle DB管理内存 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
? 描述SGA 中的內存組件 ? 實施自動內存管理 ? 手動配置SGA 參數 ? 配置自動PGA 內存管理
  • 內存管理:概覽
DBA 必須將內存管理視為其工作中至關重要的部分,因為: ? 可用內存空間量有限 ? 為某些類型的功能分配更多內存可提高整體性能 ? 自動優化的內存分配通常是正確的配置,但特定環境甚至短期情況下可能需要特別注意 由于數據庫服務器上的可用內存量有限,因此,對于Oracle DB 實例,必須注意內存的分配情況。如果將過多的內存分配給沒有此需求的特定區域使用,則很可能導致其它功能區沒有足夠的內存,無法以最優方式工作。采用自動確定和維護內存分配的功能,極大地簡化了該項任務。但是,要實現系統內存最佳利用,即使是自動優化的內存也需要進行監控,有時可能還需要某種程度的手動配置。
  • 復查Oracle DB 內存結構
復查Oracle DB 內存結構 Oracle DB 創建并使用內存結構來滿足多種用途。例如,內存可以存儲正在運行的程序代碼、用戶間共享的數據以及每個已連接的用戶的專用數據區域。 一個實例有兩個關聯的基本內存結構: ? 系統全局區(SGA) :一組共享的內存結構(稱為 SGA 組件),其中包含一個 Oracle DB 實例的數據和控制信息。SGA 在所有服務器和后臺進程之間共享。SGA 中存儲的數據的示例包括高速緩存的數據塊和共享SQL 區域。 ? 程序全局區(PGA) :包含服務器進程或后臺進程的數據及控制信息的內存區域。PGA 是Oracle DB 在服務器進程或后臺進程啟動時創建的非共享內存。服務器進程對PGA 的訪問是獨占的。每個服務器進程和后臺進程都具有自己的PGA 。 SGA 是包含實例的數據和控制信息的內存區。SGA 包含以下數據結構: ? 共享池:用于緩存可在用戶間共享的各種構造 ? 數據庫緩沖區高速緩存:用于緩存從數據庫中檢索到的數據塊 ? 保留緩沖池:一種經過優化的專用數據庫緩沖區高速緩存,用于長時間在內存中保留數據塊 ? 回收緩沖池:一種經過優化的專用數據庫緩沖區高速緩存,用于從內存中快速回收或刪除數據塊 ? nK? 緩沖區高速緩存:幾種專用數據庫緩沖區高速緩存之一,用于存放與默認數據庫塊大小不同的塊大小 ? 重做日志緩沖區:用來緩存用于恢復實例的重做信息,直到可以將其寫入磁盤中存儲的物理重做日志文件 ? 大型池:可選區域,用于為某些大型進程(如 Oracle? 備份和恢復操作)和I/O? 服務器進程分配較大的內存空間 ? Java 池:用于存儲Java 虛擬機(JVM)? 中特定會話的所有 Java 代碼和數據. ? 流池:Oracle Streams 使用它來存儲捕獲和應用所需的信息. 使用Oracle Enterprise Manager 或SQL*Plus 啟動實例時,會顯示為SGA 分配的內存量。 程序全局區(PGA)? 是一個內存區,其中包含每個服務器進程的數據及控制信息。Oracle Server? 進程為客戶機請求提供服務。每個服務器進程都有在服務器進程啟動時創建的自己專用的PGA 。PGA 只能由相應的服務器進程訪問,并且只有代表該服務器進程的 Oracle 代碼可對其進行讀取和寫入。PGA 分為兩個主要區域:堆棧空間和用戶全局區(UGA) 。 使用動態SGA 基礎結構,可以在不關閉實例的情況下更改數據庫緩沖區高速緩存、共享池、大型池、Java 池和流池的大小。 Oracle DB 使用初始化參數來創建和管理內存結構。管理內存的最簡單方法是允許數據庫自動管理和優化內存。在大多數平臺上,要實現此目的,只需設置目標內存大小初始化參數( MEMORY_TARGET )? 和最大內存大小初始化參數( MEMORY_MAX_TARGET) 。
  • 緩沖區高速緩存
緩沖區高速緩存 通過指定DB_CACHE_SIZE?參數的值,可以配置緩沖區高速緩存。緩沖區高速緩存可存放數據文件中塊大小為DB_BLOCK_SIZE 的數據塊的副本。緩沖區高速緩存是SGA 的一部分,因此所有用戶都可以共享這些塊。服務器進程將數據文件中的數據讀入緩沖區高速緩存。為了提高性能,服務器進程有時在一個讀操作中會讀取多個塊。然后由DBW n 進程將數據從緩沖區高速緩存寫入數據文件。為提高性能,DBW n 在一個寫操作中會寫入多個塊。 在任何給定時間,緩沖區高速緩存都可能會存放一個數據庫塊的多個副本。雖然該塊只存在一個當前副本,但為了滿足查詢需要,服務器進程可能需要根據過去的映像信息構造讀一致性副本。這稱為讀一致性(CR) 塊。 最近最少使用(LRU)? 列表可反映緩沖區的使用情況。緩沖區將依據其被引用時間的遠近和引用頻率進行排序。因此,最經常使用且最常用的緩沖區將列在最近最常使用一端。傳入的塊先被復制到最近最少使用一端的緩沖區中,然后該緩沖區將被指定到列表中央,作為起點。從這個起點開始,緩沖區根據使用情況在列表中上下移動。 緩沖區高速緩存中的緩沖區可以處于以下四種狀態之一: ? 已連接:當前正將該塊讀入高速緩存或正在寫入該塊。其它會話正等待訪問該塊。 ? 干凈的:該緩沖區目前未連接,如果其當前內容(數據塊)將不再被引用,則可以立即執行過期處理。這些內容與磁盤保持同步,或者緩沖區包含塊的讀一致性快照。 ? 空閑/未使用:緩沖區因實例剛啟動而處于空白狀態。此狀態與“干凈”狀態非常相似,不同之處在于緩沖區未曾使用過。 ? 臟:緩沖區不再處于連接狀態,但內容(數據塊)已更改,因此必須先通過 DBW n 將內容刷新到磁盤,然后才能執行過期處理。 服務器進程使用緩沖區高速緩存中的緩沖區;而DBW n 進程通過將更改的緩沖區寫回數據文件,使高速緩存中的緩沖區變為可用狀態。 檢查點隊列中列出將要寫出到磁盤的緩沖區。 Oracle DB 支持同一數據庫中有多種塊大小。標準塊大小用于SYSTEM 表空間。標準塊大小可以通過設置初始化參數DB_BLOCK_SIZE 來指定。其有效值介于2 KB 到32 KB? 之間,默認值為8 KB。非標準塊大小的緩沖區的高速緩存大小通過以下參數指定: ? DB_2K_CACHE_SIZE ? DB_4K_CACHE_SIZE ? DB_8K_CACHE_SIZE ? DB_16K_CACHE_SIZE ? DB_32K_CACHE_SIZE DB_ n K_CACHE_SIZE參數不能用于調整標準塊大小的高速緩存的大小。如果DB_BLOCK_SIZE 的值為n K,則設置DB_ n K_CACHE_SIZE是非法的。標準塊大小的高 速緩存的大小始終由DB_CACHE_SIZE 的值確定。 由于每個緩沖區高速緩存的大小都有限制,因此,通常并非磁盤上的所有數據都能放在高速緩存中。當高速緩存寫滿時,后續高速緩存未命中會導致Oracle DB 將高速緩存中已有的灰數據寫入磁盤,以便為新數據騰出空間。(如果緩沖區中沒有灰數據,則不需要寫入磁盤即可將新塊讀入該緩沖區。)以后若對已寫入磁盤的任何數據進行訪問,則會導致再次出現高速緩存未命中現象。 數據請求導致高速緩存命中的幾率會受到高速緩存大小的影響。高速緩存越大,包含所請求數據的幾率也就越大。因此,增加高速緩存大小會提高引起高速緩存命中的數據請求的百分比。
  • 使用多個緩沖池
數據庫管理員(DBA) 可以創建多個緩沖池來提高數據庫緩沖區高速緩存的性能。你可以根據對象的訪問情況將其分配給某個緩沖池。 緩沖池有三種: ? 保留:此池用于保留內存中可能要重用的對象。將這些對象保留在內存中可減少 I/O操作。通過使池的大小大于分配給該池的各個段的總大小,可以將緩沖區保留在此池中。這意味著緩沖區不必執行過期處理。保留池可通過指定DB_KEEP_CACHE_SIZE參數的值來配置。 ? 回收:此池用于內存中重用幾率很小的塊。回收池的大小要小于分配給該池的各個段的總大小。這意味著讀入該池的塊經常需要在緩沖區內執行過期處理。回收池可通過指定DB_RECYCLE_CACHE_SIZE 參數的值來配置。 ? 默認:此池始終存在。它相當于沒有保留池和回收池的實例的緩沖區高速緩存,可通過DB_CACHE_SIZE 參數進行配置。 注:保留池或回收池中的內存不是默認緩沖池的子集。 CREATE INDEX cust_idx … STORAGE (BUFFER _POOL KEEP); ALTER TABLE oe.customers STORAGE (BUFFER_POOL RECYCLE); ALTER INDEX oe.cust_lname_ix STORAGE (BUFFER _POOL KEEP); BUFFER_POOL 子句用于定義對象的默認緩沖池。它是STORAGE子句的一部分,對CREATE 和ALTER表、集群和索引語句有效。未明確設置緩沖池的對象中的塊將進入默認緩沖池。 語法為:BUFFER_POOL [KEEP | RECYCLE | DEFAULT] 。 使用ALTER語句更改對象的默認緩沖池時,已緩存的塊會一直保留在其當前緩沖區中,直到正常緩沖區管理活動將它們清除為止。從磁盤讀取的塊將被放置在為該段新指定的緩沖池中。 由于多個緩沖池被分配給某一個段,所以有多個段的對象可以將塊放置在多個緩沖池中。 例如,按索引組織的表在索引段和溢出段上可以有多個不同的池。
  • 共享池
內容: ? 庫高速緩存(共享sql區域):命令文本、已進行語法分析的代碼和執行計劃 ? 數據字典高速緩存:數據字典表中各表、列和權限的定義 ? 結果高速緩存:SQL 查詢和PL/SQL? 函數的結果 ? 用戶全局區(UGA) :Oracle 共享服務器的會話信息 可以使用SHARED_POOL_SIZE?初始化參數指定共享池的大小。共享池是用于存儲多個會話共享的信息的內存區。它包含不同類型的數據, 庫高速緩存:庫高速緩存包含共享 SQL 區和PL/SQL? 區-經過完全語法分析或編譯的PL/SQL? 塊和SQL 語句的表示法。PL/SQL? 塊包括: ? 過程和函數 ? 程序包 ? 觸發器 ? 匿名PL/SQL? 塊 數據字典高速緩存:數據字典高速緩存將字典對象的定義存放在內存中。 結果高速緩存:結果高速緩存包括 SQL 查詢結果高速緩存和PL/SQL? 函數結果高速緩存。此高速緩存用于存儲SQL 查詢或PL/SQL? 函數的結果,以加快它們將來的執行速度。 用戶全局區:UGA 包含 Oracle? 共享服務器的會話信息。使用共享服務器會話時,如果尚未配置大型池,則UGA 位于共享池中。
  • 大型池
? 為以下對象提供大型內存分配: – 共享服務器和 Oracle XA? 接口的會話內存 – I/O? 服務器進程 – Oracle DB? 備份和還原操作 – 并行查詢操作 – 高級排隊內存表存儲 ? 減少潛在的共享池碎片 ? 是由AMM 和ASMM 管理的 ? 大小是由LARGE_POOL_SIZE參數指定的 大型池 數據庫管理員可以配置一個稱為大型池的可選內存區,以便為以下對象提供大型內存分配: ? 共享服務器和Oracle XA 接口(在事務處理與多個數據庫交互時使用)的會話內存 ?I/O 服務器進程 ? Recovery Manager (RMAN) I/O? 從屬進程的緩沖區 ? 在語句并行執行中使用的消息緩沖區 ? 高級排隊內存表存儲 通過為上面列項目分配會話內存,減少了共享池中由于頻繁分配和取消分配大對象而產生的碎片。將大對象從共享池中分離出來,可增加共享池內存的使用效率,這意味著,它可以將更多內存用于處理新的請求,以及在需要時用于保留現有數據。 大型池可以由AMM? 和ASMM 自動管理。還可以用 LARGE_POOL_SIZE參數設置其大小。
  • Java 池和流池
? Java 池內存用于將JVM 中特定于會話的所有Java 代碼和數據存儲在服務器內存中。 ? Oracle Streams 專門使用流池內存來: – 存儲已緩沖的隊列消息 – 為Oracle Streams 進程提供內存 Java 池和流池 Java 池內存用于將JVM 中特定于會話的所有 Java 代碼和數據存儲在服務器內存中。Java 池內存的使用方式有多種,具體取決于Oracle DB 運行的模式。 Java 池指導統計信息提供有關用于Java 的庫高速緩存內存的信息,并且預測如何更改Java 池的大小就可以影響分析速率。將statistics_level 設置為TYPICAL或更高級別時,則在內部打開Java 池指導。關閉指導時,將重置這些統計信息。 流池專門由Oracle Streams 使用。流池存儲已緩沖的隊列消息,并且為Oracle Streams 捕獲進程和應用進程提供內存。 除非專門配置流池,否則其大小以零開始。使用Oracle Streams 時,池大小會根據需要動態地增長。
  • 重做日志緩沖區
? SGA 中的循環緩沖區 ? 存放對數據庫所做更改的信息 ? 包含重做條目,重做條目中具有重做由諸如DML 和DDL 操作所做更改的信息 日志寫進程(LGWR)? 傳送的內容: – 用戶進程提交事務處理時 – 重做日志緩沖區滿三分之一時 – DBW n 進程將修改的緩沖區寫入磁盤之前 Oracle Server? 進程將重做條目從用戶的內存空間復制到每個DML 或DDL 語句的重做日志緩沖區。重做條目包含重建或重做DML 和DDL 操作對數據庫的更改所必需的信息。它們用于數據庫恢復,需要占用緩沖區中的連續空間。 重做日志緩沖區是一個回收緩沖區;服務器進程可以用新條目覆蓋重做日志緩沖區中已寫入磁盤的條目。LGWR 進程的寫速度通常都很快,足以確保緩沖區中始終有存儲新條目的空間。LGWR 進程將重做日志緩沖區寫入磁盤上的活動聯機重做日志文件(或活動組成員)中。LGWR 進程將LGWR 上次寫入磁盤以來進入緩沖區的所有重做條目復制到磁盤。 什么導致LGWR 執行寫操作? 在以下情況下,LGWR 會從重做日志緩沖區中寫出重做數據: ? 用戶進程提交事務處理時 ? 每隔三秒鐘,或者重做日志緩沖區滿三分之一時 ? DBW n 進程將修改的緩沖區寫入磁盤時(如果相應的重做日志數據尚未寫入磁盤)
  • 自動內存管理:概覽
通過自動內存管理,數據庫可以根據工作量自動調整SGA 和PGA 的大小。 ALTER SYSTEM SET MEMORY_TARGET=300M; 通過自動內存管理(AMM),Oracle DB 可以自動管理SGA 內存以及實例PGA 內存的大小。為此,在大多數平臺上,只需要設置一個目標內存大小初始化參數( MEMORY_TARGET )? 和一個最大內存大小初始化參數( MEMORY_MAX_TARGET),數據庫就會根據處理需求在SGA 與實例 PGA 之間動態交換內存。 通過導航到“Server > Memory Advisors (服務器> 內存指導)”(在“Database Configuration(數據庫配置)”區域中),并單擊“Enable(啟用)”按鈕,可啟用Oracle Enterprise Manager 中的AMM。

?

啟用自動內存管理后, 數據庫將會自動設置內存的最佳分配方式。將不時更改內存分配以適應工作量的變化。 “最大內存大小”指定數據庫可以分配的, 并且為了使用自動內存管理而必須設置的內存量。

?

通過這種內存管理方法,數據庫還可以動態調整單個SGA 組件的大小以及單個PGA 的大小。 因為目標內存初始化參數是動態的,因此可以隨時更改目標內存大小而不必重新啟動數據庫。最大內存大小相當于一個上限,以防你無意中將目標內存大小設置得太高。因為某些SGA 組件的大小不容易收縮,或者其大小必須不低于某個下限值,所以數據庫還要防止你將目標內存大小設置得太低。 這種間接的內存轉移依賴于操作系統(OS) 的共享內存釋放機制。將內存釋放給 OS 后,其它組件可以通過向OS 請求內存來分配內存。目前,Linux、Solaris 、HPUX、AIX 和Windows 平臺上已實施了自動內存管理。
  • Oracle DB 內存參數

自動內存管理是用兩個初始化參數進行配置的:

MEMORY_TARGET:動態控制SGA和PGA時,Oracle總共可以使用的共享內存大小,這個參數是動態的,因此提供給Oracle的內存總量是可以動態增大,也可以動態減小的。它不能超過MEMORY_MAX_TARGET參數設置的大小。默認值是0。

?

MEMORY_MAX_TARGET:這個參數定義了MEMORY_TARGET最大可以達到而不用重啟實例的值,如果沒有設置MEMORY_MAX_TARGET值,默認等于MEMORY_TARGET的值。

使用動態內存管理時,SGA_TARGET和PGA_AGGREGATE_TARGET代表它們各自內存區域的最小設置,要讓Oracle完全控制內存管理,這兩個參數應該設置為0。

?

Oracle DB 內存大小設置參數 上圖展示了內存初始化參數的層次結構。雖然僅需要設置MEMORY_TARGET 來觸發自動內存管理,但仍可以為各種高速緩存設置下限值。因此,如果子參數是用戶設置的,則這些參數值將是Oracle DB Server 自動優化該組件時的下限值。 ? 如果將SGA_TARGET和PGA_AGGREGATE_TARGET設置為非零值,則可將其分別視為SGA 和PGA 大小的下限值。MEMORY_TARGET 可以采用從SGA_TARGET+ PGA_AGGREGATE_TARGET到MEMORY_MAX_SIZE的值。 ? 如果設置了SGA_TARGET,則數據庫將僅自動優化SGA 的子組件的大小。PGA 的自動優化與是否顯式設置PGA 無關。但是,不會自動優化整個 SGA ( SGA_TARGET)? 和PGA ( PGA_AGGREGATE_TARGET) ,即不自動增長或收縮。
  • 監視自動內存管理
在EM? 主頁(“Related Links(相關鏈接)”部分)中,導航到“Advisor Central > Memory Advisors(指導中心 >? 內存指導)”。此時,將顯示“Memory Advisors(內存指導)”頁。 啟用了自動內存管理后,可以在“Memory Advisors(內存指導)”頁的“Allocation History(分配歷史記錄)”部分看到以圖形方式顯示的內存大小組件歷史記錄。第一個矩形圖的上部為可優化的那部分PGA ,其下部是所有SGA 。 第二個矩形圖的上部為共享池大小,其下部對應于緩沖區高速緩存大小。 在此頁上,還可以通過單擊“Advice (建議)”按鈕訪問內存目標指導。此指導將提供各種內存總大小可能實現的DB 時間改善。 注:您也可以使用 V$MEMORY_TARGET_ADVISOR 視圖查看內存目標指導。 如果要通過命令行監視自動內存管理做出的決定: ? V$MEMORY_DYNAMIC_COMPONENTS包含所有內存組件的當前狀態 ? V$MEMORY_RESIZE_OPS 包含最近完成的800? 個內存大小調整請求的循環歷史記錄緩沖區 ? V$MEMORY_TARGET_ADVICE提供針對MEMORY_TARGET 初始化參數的優化建議 動態性能視圖V$MEMORY_DYNAMIC_COMPONENTS顯示所有動態優化的內存組件的當前大小,其中包括SGA 和實例PGA 的總大小。V$MEMORY_TARGET_ADVICE視圖提供針對MEMORY_TARGET 初始化參數的優化建議。 查看V$MEMORY_TARGET_ADVICE視圖時,MEMORY_SIZE_FACTOR 為1? 的行顯示當前的內存大小(由MEMORY_TARGET 初始化參數設置)以及完成當前工作量所需的DB 時間量。在之前以及之后的行中,將顯示使用一組替代MEMORY_TARGET 大小的結果。如果將MEMORY_TARGET 參數更改為替代大小中的任何一個,那么數據庫將顯示大小因子(當前大小的乘數)以及完成當前工作量的估計DB 時間。請注意,如果內存總大小小于當前MEMORY_TARGET 大小,則估計的DB 時間會增加。 sys@TEST0924> desc V$MEMORY_TARGET_ADVICE Name????????????????????????????????????????????????? Null???? Type ----------------------------------------------------- -------- ------------------------------------ MEMORY_SIZE??????????????????????????????????????????????????? NUMBER MEMORY_SIZE_FACTOR???????????????????????????????????????????? NUMBER ESTD_DB_TIME?????????????????????????????????????????????????? NUMBER ESTD_DB_TIME_FACTOR??????????????????????????????????????????? NUMBER VERSION??????????????????????????????????????????????????????? NUMBER sys@TEST0924> select * from V$MEMORY_TARGET_ADVICE; MEMORY_SIZE MEMORY_SIZE_FACTOR ESTD_DB_TIME ESTD_DB_TIME_FACTOR??? VERSION ----------- ------------------ ------------ ------------------- ---------- 2400??????????????? .75????????? 326?????????????????? 1????????? 0 3200?????????????????1????????? 326?????????????????? 1????????? 0 4000?????????????? 1.25????????? 326?????????????????? 1????????? 0 4800??????????????? 1.5????????? 326?????????????????? 1????????? 0 5600?????????????? 1.75????????? 326?????????????????? 1????????? 0 6400????????????????? 2????????? 326?????????????????? 1????????? 0 6 rows selected. sys@TEST0924> show parameter memory NAME???????????????????????????????? TYPE??????? VALUE ------------------------------------ ----------- ------------------------------ hi_shared_memory_address???????????? integer???? 0 memory_max_target??????????????????? big integer 3200M memory_target??????????????????????? big integer 3200M shared_memory_address??????????????? integer???? 0
  • 有效使用內存:準則
? 使SGA 適合物理內存。 ? 優化以實現高緩沖區高速緩存命中率,但要注意以下幾點: – 即使有效且必需的全表掃描也會降低命中率。 – 可能存在因不必要地重復讀取同一塊而出現命中率虛升的情況。 ? 使用內存指導。 如果可能,最好使SGA 適合物理內存,以便提供最快的訪問速度。即使操作系統可能提供額外的虛擬內存,該內存也經常會因其性質而換出到磁盤。在某些平臺上,可以使用LOCK_SGA 初始化參數將SGA 鎖定到物理內存中。此參數不能與 AMM? 或ASMM 一起使用。 執行SQL 語句時,將請求數據塊進行讀、寫或讀寫操作。這被認為是一個邏輯I/O。請求某個塊時,會先查看它是否已在內存中。如果不在內存中,則從磁盤中讀取塊,這稱為物理I/O。在內存中發現塊的次數與邏輯I/O? 的總次數之比,稱為緩沖區高速緩存命中率。 通常,命中率越高越好,因為這意味著在內存中找到了更多的塊,而不必進行磁盤I/O 操作。 緩沖區高速緩存命中率高于99% 的情況不罕見,但這并不總表示系統優化好了。如果某個查詢的執行頻率超過了必要的次數,而且它不斷地反復請求相同的塊,則命中率就會提高。如果這是個低效或不必要的查詢,則會虛升命中率。這是因為它首先不應以這種方式執行或不應如此頻繁地執行。 此外,考慮到大型全表掃描(完全讀取整個表)會降低此命中率,因為可能要從磁盤中讀取整個表;此類掃描可能不會利用某些已在緩沖區高速緩存中的塊。所以,如果應用程序中有一些必要的大型全表掃描,則即使是優化良好的數據庫,其數據庫緩沖區高速緩存命中率也可能始終很低。 使用Oracle Enterprise Manager 內存指導。這些指導可以幫助您基于特定數據庫中的活動調整SGA 的大小。
  • 庫高速緩存的內存優化準則
? 為開發人員制定格式使用約定,以便SQL 語句符合高速緩存的要求。 ? 使用綁定變量。 ? 消除不必要的重復SQL。 ? 考慮使用CURSOR_SHARING。 ? 盡可能使用PL/SQL。 ? 緩存序列號。 ? 連接庫高速緩存中的對象。 庫高速緩存是共享池的一部分,它是Oracle DB 用于存儲所有SQL 、Java 代碼、PL/SQL 過程和程序包以及控制結構(如鎖定和庫高速緩存句柄)的地方。這些代碼進入此中央位置的目的是為了能夠讓所有用戶共享。共享的好處在于,所有用戶都能利用SQL 代為執行的工作。因此,對于每條語句,不論它執行多少次,也不管有多少用戶執行它,對語句進行語法分析和確定數據訪問路徑(也稱為“解釋計劃”)之類的任務都只執行一次。 如果庫高速緩存過小,則沒有空間容納所有要執行的語句,因此對于某些語句,也就無法利用此工作共享的優勢。如果庫高速緩存過大,又會給系統帶來管理其內容的負擔。 因為庫高速緩存中最終可能會填滿一些看似不同、實際卻是同一語句副本的語句。導致此問題的一個常見原因是每條語句的格式稍有不同。如果字符串不完全比較就沒有匹配項。另一個原因是使用了文字而不是綁定變量。當兩條語句之間的唯一差別是文字值時,如果用綁定變量替換這些文字,則大多數情況下,這些語句的每次執行和整個系統都將受益。 可以設置CURSOR_SHARING?初始化參數,指示系統在語句的其它部分都匹配時自動用綁定變量替換文字。通常,在適當時使用綁定變量更正應用程序之前,應將此設置作為臨時手段。與所有這些準則一樣,使用此變量也可能有其它負面影響,這一點應該調查清楚。 避免從應用程序中的幾個不同位置發出同一SQL 語句,而是使用PL/SQL? 將一條或多條語句放置在一個存儲過程中。以后只需調用該存儲過程。這樣可保證該SQL 語句是共享的,因為它只位于一個地方。同樣,該SQL 語句也已經過語法分析并有了解釋計劃,因為它位于一個已編譯的存儲過程中。 序列號可以緩存。因此,如果某些序列的活動頻繁,請為其設置一個合適的高速緩存大小,然后利用它。 可以使用DBMS_SHARED_POOL 程序包來連接庫高速緩存中的對象。這樣可減少重新加載和重新編譯對象的幾率。
  • 自動共享內存管理:概覽
? 自動根據工作量變化調整 ? 最大程度地提高內存利用率 ? 有助于消除內存不足的錯誤 如果AMM? 不能正常工作,因為需要一個固定的PGA ,考慮使用可簡化 SGA 內存管理的自動共享內存管理(ASMM) 。可以使用SGA_TARGET初始化參數指定實例的可用SGA 內存總量,然后,Oracle DB 會自動在各個SGA 組件間分配該內存,從而確保內存的高效利用。 例如,對于白天運行大型聯機事務處理(OLTP)? 作業(要求大型緩沖區高速緩存)和夜晚運行并行批處理作業(要求大型池的內存空間比較大)的系統,就必須同時配置緩沖區高速緩存和大型池,以便適應峰值需求。 有了ASMM 功能,當 OLTP? 作業運行時,緩沖區高速緩存會獲取大部分內存來保證良好的I/O? 性能。以后啟動數據分析和報告批處理作業時,內存又會自動遷移到大型池,供并行查詢操作使用,而不會產生內存溢出錯誤。 如果使用的是服務器參數文件(SPFILE) ,則Oracle DB 會在每次關閉實例時記住自動優化的組件的大小。因此,系統不需要在每次啟動實例時都重新了解工作量的特性。它可以利用從以前的實例中獲取的信息,從上次關閉時中斷的位置開始繼續評估工作量。
  • ASMM 的工作原理
? ASMM 以MMON?在后臺捕獲的工作量信息為基礎。 ? MMON 使用內存指導。 ? 將內存移到MMAN 最迫切需要的地方。 ? 如果使用SPFILE(推薦): – 在關閉時保存組件大小 – 保存的值用于引導程序組件大小 – 無需再確定最佳值 自動共享內存管理功能使用SGA 內存中介,此內存中介由可管理性監視器( MMON)? 和內存管理器( MMAN)? 這兩個后臺進程實施。統計信息和內存指導數據由MMON 定期在內存中捕獲。MMAN 根據MMON 決策來協調內存組件的大小。SGA 內存中介會不斷跟蹤組件的大小和待處理的大小調整操作。 SGA 內存中介會觀察系統和工作量,以便確定理想的內存分配方案。SGA 內存中介每隔幾分鐘就執行一次這種檢查,使內存始終用在需要的地方。如果沒有自動共享內存管理功能,必須分別預計各組件在峰值時的內存需求,然后對其內存大小進行調整。 在工作量信息基礎上,自動共享內存管理功能會: ? 定期在后臺捕獲統計信息 ? 使用內存指導 ? 進行假設分析,確定最佳內存分配方案 ? 將內存移到最迫切需要的地方 ? 如果使用了SPFILE,則在關閉時保存組件大小(這些大小可以在最后一次關閉前重新起用)
  • 啟用自動共享內存管理功能
要從手動共享內存管理模式下啟用ASMM,執行以下操作: 1. 獲取SGA_TARGET的值: SELECT ((SELECT SUM(value) FROM V$SGA) - (SELECT CURRENT_SIZE FROM V$SGA_DYNAMIC_FREE_MEMORY)) "SGA_TARGET" FROM DUAL; sys@TEST0924> SELECT ((SELECT SUM(value) FROM V$SGA) - (SELECT CURRENT_SIZE 2? FROM V$SGA_DYNAMIC_FREE_MEMORY)) "SGA_TARGET" FROM DUAL; SGA_TARGET ---------- 2501591040 sys@TEST0924> select 2501591040/1024/1024 from dual; 2501591040/1024/1024 -------------------- 2385.70313 2. 使用該值設置SGA_TARGET。 3. 將自動設置大小的SGA 組件的值設置為0。 要從自動內存管理模式切換到ASMM,請執行以下操作: 1. 將初始化參數MEMORY_TARGET 設置為0。 2. 將自動設置大小的SGA 組件的值設置為0。 啟用ASMM 的具體過程取決于是從手動共享內存管理模式更改為 ASMM,還是從自動內存管理模式更改為ASMM。要從手動共享內存管理模式更改為 ASMM,請執行以下操作: 1. 運行以下查詢獲取SGA_TARGET的值: SELECT ((SELECT SUM(value) FROM V$SGA) - (SELECT CURRENT_SIZE FROM V$SGA_DYNAMIC_FREE_MEMORY)) “SGA_TARGET” FROM DUAL; 2. 設置SGA_TARGET的值: ALTER SYSTEM SET SGA_TARGET= value [SCOPE={SPFILE|MEMORY|BOTH}] 其中value是在步驟1? 中計算的值,或者是介于所有SGA 組件的總大小與 SGA_MAX_SIZE之間的某個值。 3. 將自動設置大小的SGA 組件的值設置為0。為此,需要編輯文本初始化參數文件,或者發出ALTER SYSTEM語句。如果需要,重新啟動實例。 sys@TEST0924> desc v$sgainfo; Name????????????????????????????????????????????????? Null???? Type ----------------------------------------------------- -------- ------------------------------------ NAME?????????????????????????????????????????????????????????? VARCHAR2(32) BYTES????????????????????????????????????????????????????????? NUMBER RESIZEABLE???????????????????????????????????????????????????? VARCHAR2(3) sys@TEST0924> select * from v$sgainfo; NAME????????????????????????????????? BYTES RES -------------------------------- ---------- --- Fixed SGA Size????????????????????? 2232960 No Redo Buffers?????????????????????? 16326656 No Buffer Cache Size??????????????? 1795162112 Yes Shared Pool Size????????????????? 637534208 Yes Large Pool Size??????????????????? 16777216 Yes Java Pool Size???????????????????? 16777216 Yes Streams Pool Size????????????????? 16777216 Yes Shared IO Pool Size?????????????????????? 0 Yes Granule Size?????????????????????? 16777216 No Maximum SGA Size???????????????? 3340451840 No Startup overhead in Shared Pool?? 117967168 No Free SGA Memory Available???????? 838860800 12 rows selected. 要從自動內存管理模式更改為ASMM,請執行以下操作: 1. 將初始化參數MEMORY_TARGET 設置為0。 ALTER SYSTEM SET MEMORY_TARGET = 0; 數據庫將根據當前的SGA 內存分配設置SGA_TARGET。 2. 將自動設置大小的SGA 組件的值設置為0。完成后,重新啟動實例。
  • 禁用ASMM
? 將SGA_TARGET設置為0? 可禁用自動優化功能。 ? 自動優化的參數設置為其當前大小。 ? SGA 大小總體上不受影響。 通過將SGA_TARGET設置為0,可以動態選擇禁用自動共享內存管理。在此情況下,所有自動優化的參數的值都將設置為其對應組件的當前大小;即使用戶早先為自動優化的參數指定了其它非零值,也是如此。 例如,SGA_TARGET的值為8 GB,SHARED_POOL_SIZE 的值為1 GB。 如果系統將共享池組件的大小內部調整為2 GB,則將SGA_TARGET設置為0? 會導致SHARED_POOL_SIZE 被設置為2 GB,從而覆蓋用戶定義的原有值。
  • 程序全局區(PGA)
默認情況下,啟用自動PGA 內存管理。 程序全局區(PGA)? 是包含某服務器進程的數據及控制信息的內存區。這是 Oracle Server 在服務器進程啟動時創建的非共享內存,只有該服務器進程才能訪問。由關聯到某個Oracle? 實例的所有服務器進程分配的PGA 總內存,也稱為該實例分配的聚集 PGA 內存。使用共享服務器時,部分PGA 可位于 SGA 中。 PGA 內存通常包含以下各項: 專用SQL 區 專用SQL 區包含綁定信息和運行時內存結構等數據。這些信息是每個會話的SQL 語句調用所特有的;在其它方面,綁定變量有不同的值,游標的狀態也不同。發出SQL 語句的每個會話都有一個專用SQL 區。提交同一SQL 語句的每個用戶也都有其自己的專用SQL 區,該專用SQL 區使用一個共享SQL 區。這樣,許多專用SQL 區可與同一個共享SQL 區關聯。專用SQL 區的位置取決于為會話建立的連接類型。如果會話是通過專用服務器連接的,則專用SQL 區位于該服務器進程的PGA 中。不過,如果會話是通過共享服務器連接的,則部分專用SQL 區將保留在SGA 中。 游標和SQL 區 Oracle Pro*C? 程序或Oracle? 調用接口(OCI)? 程序的應用程序開發人員可以顯式打開特定專用SQL 區的游標或句柄,并在該程序的整個執行過程中將它們用作命名資源。數據庫為某些SQL 語句隱式發出的遞歸游標也使用共享SQL 區。 工作區 對于復雜查詢(例如,決策支持查詢),會將大部分PGA 供內存密集型運算符分配的工作區專用,例如: ? 基于排序的運算符(如ORDER BY 、GROUP BY 和ROLLUP )和窗口函數 ? 散列聯接 ? 位圖合并 ? 位圖創建 ? 批量加載操作使用的寫緩沖區 排序運算符使用工作區(排序區),對一組行執行內存中排序。與此類似,散列聯接運算符使用工作區(散列區),根據其左側輸入內容生成散列表。 工作區的大小是可以控制和優化的。通常,較大的工作區可以顯著改進特定運算符的性能不過代價是消耗較多的內存。 會話內存 會話內存是用于存放會話的變量(登錄信息)以及與會話相關的其它信息的內存。對于共享服務器,會話內存是共享的,而不是專用的。 自動PGA 內存管理 默認情況下,Oracle DB 會自動對供實例PGA 專用的內存總量進行全局管理。可以通過設 置初始化參數PGA_AGGREGATE_TARGET來控制此內存量。隨后,Oracle DB 會努力確保 分配給所有數據庫服務器進程和后臺進程的PGA 內存總量始終不超過此目標值。
  • 使用V$PARAMETER 視圖
SGA_TARGET = 8G DB_CACHE_SIZE = 0 JAVA_POOL_SIZE = 0 LARGE_POOL_SIZE = 0 SHARED_POOL_SIZE = 0 STREAMS_POOL_SIZE = 0 SELECT name, value, isdefault FROM?? v$parameter?????WHERE? name LIKE '%size'; 如果為SGA_TARGET指定非零值,且未指定自動優化的SGA 參數的值,則V$PARAMETER 視圖中自動優化的SGA 參數的值為 0,ISDEFAULT 列的值為TRUE。 如果已為任何自動優化的SGA 參數指定了值,則查詢 V$PARAMETER 時顯示的值是你為該參數指定的值。 sys@TEST0924> SELECT name, value, isdefault FROM?? v$parameter???? WHERE? name LIKE '%size'; NAME?????????????????????????? VALUE????????????????????????????????????????????? ISDEFAULT ------------------------------ -------------------------------------------------- --------- sga_max_size?????????????????? 3355443200???????????????????????????????????????? TRUE shared_pool_size?????????????? 0????????????????????????????????????????????????? FALSE large_pool_size??????????????? 0????????????????????????????????????????????????? TRUE java_pool_size???????????????? 0????????????????????????????????????????????????? TRUE streams_pool_size????????????? 0????????????????????????????????????????????????? TRUE shared_pool_reserved_size????? 31876710?????????????????????????????????????????? TRUE db_keep_cache_size???????????? 50331648?????????????????????????????????????????? FALSE db_recycle_cache_size????????? 0????????????????????????????????????????????????? TRUE db_flash_cache_size??????????? 0????????????????????????????????????????????????? TRUE db_recovery_file_dest_size???? 9565110272???????????????????????????????????????? FALSE 來源:http://blog.csdn.net/rlhua/article/details/12493791

?

轉載于:https://www.cnblogs.com/gispf/p/3748050.html

總結

以上是生活随笔為你收集整理的[转]Oracle DB管理内存的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。