OCP課程54:管理II之管理記憶體

stonebox1122發表於2016-06-22

課程目標:

  • SGA中的記憶體元件
  • 自動記憶體管理
  • 手動配置SGA
  • 配置自動PGA記憶體管理

1、記憶體管理:概覽

clipboard

因為資料庫伺服器上可用記憶體有限,因此,必須關注資料庫例項的記憶體分配。如果不必要的區域分配了太多的記憶體,那麼其他需要記憶體的區域就有可能效能不佳。使用記憶體的自動分配和維護功能可以大大減輕記憶體管理工作。但即使是自動管理的記憶體也需要監控和最佳化,並可能需要進行手動配置。


2、回顧Oracle資料庫記憶體結構

clipboard[1]

資料庫建立和使用各種用途的記憶體結構。例如,儲存正在執行的程式程式碼,使用者之間共享的資料以及每個連線使用者的私有資料區。

例項2個 基本記憶體結構:

  • 系統全域性區(SGA):一組共享記憶體結構,稱為SGA,包含一個資料庫例項的資料和控制資訊。SGA由所有伺服器和後臺程式共享。
  • 程式全域性區(PGA):包含一個伺服器或者後臺程式的資料和控制資訊的記憶體區域。PGA是資料庫在伺服器或者後臺程式啟動時建立的非共享記憶體。每個伺服器程式和後臺程式都有它自己的PGA。

SGA是包含例項的資料和控制資訊的記憶體區域,包含以下資料結構:

  • 共享池(Shared pool):快取各種結構,可以在使用者之間共享
  • 資料庫緩衝區快取(Database buffer cache):快取從資料庫中檢索的資料塊
  • 保持緩衝池(KEEP buffer pool):是資料庫緩衝區快取的一種特別型別,可以長時間保留記憶體中的資料塊。
  • 迴圈緩衝池(Recycle buffer pool):是資料庫緩衝區快取的一種特別型別,可以快速回收記憶體。
  • nK緩衝區快取(nK buffer cache):是資料庫緩衝區快取的一種特別型別,存放與預設的塊大小不同的塊。
  • 重做日誌緩衝(Redo log buffer):快取重做資訊(用於例項恢復),直到它可以被寫在到儲存在磁碟上的物理重做日誌檔案中。
  • 大池(Large pool):是可選擇的區域,為某些大程式提供大量的記憶體分配,例如:資料庫備份和恢復操作,以及I/O伺服器程式
  • Java池(Java pool):用於所有會話指定的Java程式碼和在Java虛擬機器(JVM)中的資料。
  • 流池(Streams pool):用於Oracle Streams。

當使用EM或者SQL*Plus啟動例項,會顯示分配給SGA的記憶體總量。

程式全域性區(PGA)是一個包含每一個伺服器程式資料和控制資訊的記憶體區域。一個伺服器程式處理一個客戶請求。每個伺服器程式都有自己的私有PGA。PGA主要分為兩部分:堆疊空間和使用者全域性區(UGA)。

用動態SGA,可以改變資料庫緩衝區快取,共享池,大池,Java池和流池的大小而不需要關閉例項。

資料庫使用初始化引數來建立和管理記憶體結構。管理記憶體的最簡單的方法是讓資料庫自動管理和調整,只需要設定一個目標記憶體大小初始化引數(memory_target)和最大記憶體大小初始化引數(memory_max_target)。


3、緩衝區快取

clipboard[2]

可以透過指定DB_CACHE_SIZE引數配置緩衝區快取。緩衝區快取存放大小為DB_BLOCK_SIZE引數指定的資料檔案資料塊。緩衝區快取是SGA的一部分,所以所有的使用者都可以共享這些塊。伺服器程式從資料檔案讀取資料到緩衝區快取。為了提高效能,在一個單一的讀操作中,伺服器程式有時會讀取多個塊。DBWn程式將資料從緩衝區快取寫入到資料檔案,為了提高效能,DBWn在一個寫操作寫入多個塊。

在任何給定的時間,緩衝區快取可以儲存一個資料庫塊的多個複製。只有一個當前塊複製存在,但為了滿足查詢,伺服器程式可能需要從過去的映像資訊構建讀一致的副本。這被稱為一致讀(CR)塊。

最近最少使用(LRU)清單反映了緩衝區的使用。綜合考慮最近使用情況以及最常使用情況,對緩衝區進行排序。也就是說,最經常和最近使用的緩衝區在最多最近使用端。剛剛複製進行來的塊位於最少最近使用端,位於清單的中間,作為一個起始點,從這裡,根據使用情況向上或者向下移動。

緩衝區快取有如下四種狀態:

  • Pinned:要麼正在將塊讀入到快取,要麼正在將塊寫入到快取。其他會話等待訪問該塊。
  • Clean:unpinned狀態,如果其當前內容不再需要,則可以被覆蓋使用。其內容要麼與磁碟一致,要麼包含塊的讀一致快照。
  • Free/unused:例項剛剛啟動時緩衝區為空,與clean狀態相似,只是這些緩衝區還沒有被使用。
  • Dirty:不再pinned,內容(資料塊)發生了改變,被覆蓋之前需要由DBWn寫入到磁碟。

伺服器程式使用緩衝區快取,DBWn程式將修改的緩衝區快取寫回到資料檔案以使這些快取可再被使用。檢查點佇列列出了將要寫入到磁碟的緩衝區。

在同一資料庫中Oracle支援多種塊大小。標準塊大小用於SYSTEM表空間。透過設定DB_BLOCK_SIZE初始化引數指定標準塊大小。可以從2KB到32KB,預設是8KB。非標準塊緩衝區快取大小由以下引數指定:

  • db_2k_cache_size
  • db_4k_cache_size
  • db_8k_cache_size
  • db_16k_cache_size
  • db_32k_cache_size

DB_nK_CACHE_SIZE引數不能用於設定標準塊的快取大小。如果DB_BLOCK_SIZE的值為8K,則不能設定DB_8K_CACHE_SIZE。對於標準塊的快取大小總是由db_cache_size值確定。

每一個緩衝區快取的空間都是有限的,不能將磁碟上所有的資料都放入到緩衝區快取。當緩衝區快取滿了,後續的快取命中失敗會導致資料庫將髒塊寫入到磁碟以便騰出空間給新的資料(如果一個緩衝區沒有髒塊,則在讀入新塊到緩衝區之前不需要將其寫入到磁碟)。後續對剛寫入到磁碟的資料訪問又會導致新的快取命中失敗。

快取的大小會影響一個資料請求快取命中的可能性。如果快取大,則更可能包含被請求的資料。增加快取的大小會增加快取命中率的百分比。

例子:檢視資料庫緩衝區快取的大小

SQL> select name,bytes/1024/1024 from v$sgainfo where name='Buffer Cache Size';

NAME                           BYTES/1024/1024

------------------------------ ---------------

Buffer Cache Size                          336


4、使用多個緩衝池

clipboard[3]

資料庫管理員可以透過建立多個緩衝池提高資料庫緩衝區快取的效能。根據物件的訪問方式分配不同的緩衝池。有三種型別緩衝池:

  • Keep:這個池是用來儲存很可能被重用物件。在記憶體中儲存這些物件可以減少I/O操作。其大小要比放入該池的段的總大小要大。這樣就不需要換出。Keep池由db_keep_cache_size引數配置大小。
  • Recycle:這個池是用來儲存很少有機會被重複使用的塊。其大小要比放入該池的段的總大小要小。這意味著塊讀入到池中就會很快被換出。Recycle池是由db_recycle_cache_size引數配置大小。
  • Default:這個池始終存在。相當於一個沒有Keep池和Recycle池的例項的緩衝區快取,由db_cache_size引數配置大小。

注意:Keep池和Recycle池不是Default池的一部分。

SQL> show parameter db_keep_cache_size;

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

db_keep_cache_size                   big integer 0

SQL> show parameter db_recycle_cache_size;

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

db_recycle_cache_size                big integer 0

SQL> show parameter db_cache_size;

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

db_cache_size                        big integer 0


5、使用多個緩衝池

clipboard[4]

可以在CREATE和ALTER table,cluster和index語句的STORAGE子句使用BUFFER_POOL子句定義物件的預設緩衝池。如果不顯式設定緩衝池則使用預設的Default池。

語法為:BUFFER_POOL [KEEP | RECYCLE | DEFAULT].

當使用ALTER語句修改物件的預設緩衝池,已經讀入的塊仍然保留在當前的緩衝池,直到被正常的快取管理活動刷出。從磁碟讀入的該物件的塊才會被放入到新指定的緩衝池。

由於緩衝池被分配給段,多段的物件可以有多個緩衝池中的塊。例如,索引組織表可以在索引和溢位段上定義不同的池。

SQL> create index emp_id_idx on emp(employee_id) storage(buffer_pool keep);

Index created.

SQL> alter table emp storage(buffer_pool recycle);

Table altered.


6、共享池

clipboard[5]

使用shared_pool_size初始化引數指定共享池的大小。共享池是儲存多個會話共享資訊的儲存區。包含了不同型別的資料,如上圖所示。

庫快取(Library cache):庫快取包含共享SQL和PL/SQL區(PL/SQL塊和SQL語句的編譯和解析)PL/SQL塊包括:

  • 儲存過程和函式
  • 觸發器
  • 匿名PL/SQL塊

資料字典快取(Data dictionary cache):資料字典快取存放字典物件的定義。

結果快取(Result cache):包括SQL查詢結果快取和PL/SQL函式結果快取。這個快取用來儲存SQL查詢或PL/SQL函式結果以加快其未來執行。

使用者全域性區(User Global Area):Oracle共享伺服器的會話資訊。當使用共享伺服器模式,如果沒有配置大池,則UGA位於共享池。

例子:檢視共享池大小

SQL> select name,bytes/1024/1024 from v$sgainfo where name='Shared Pool Size';

NAME                           BYTES/1024/1024

------------------------------ ---------------

Shared Pool Size                           160


7、大池

clipboard[6]

大池是SGA中的一塊可選記憶體區域,用於大量記憶體分配:

  • 用於共享服務(Shared Server MTS方式中)的會話記憶體和Oracle分散式事務處理的Oracle XA介面
  • IO服務程式
  • RMAN的I/O操作緩衝
  • 使用並行查詢(Parallel Query Option PQO)時的訊息緩衝
  • 高階佇列記憶體表儲存

大池為以上這些分配記憶體可以減少共享池的碎片,更高效的使用共享池。

大池可以透過AMM和ASMM自動管理。也可以用large_pool_size引數配置大小。

例子:檢視大池大小

SQL> select name,bytes/1024/1024 from v$sgainfo where name='Large Pool Size';

NAME                           BYTES/1024/1024

------------------------------ ---------------

Large Pool Size                              8


8、Java池和流池

clipboard[7]

Java池的記憶體是用於儲存所有會話中特定的Java程式碼和JVM中資料。Java池的使用方式依賴於Oracle服務的執行模式。不要認為使用Java開發的程式就要用Java池,只是說在資料庫裡面使用Java去編寫了儲存過程才會用到Java池,但是目前很少有人用Java去編寫儲存過程了。Java池的大小可以透過引數JAVA_POOL_SIZE來設定。

Java池顧問的統計資料提供了有關庫快取記憶體的資訊,並預測了Java池的大小變化會如何影響解析率。當statistics_level設定為typical或更高時才會開啟Java池顧問。當顧問被關閉時,統計資料會被重置。

流池是Oracle 10g中新增加的。是為了增加對流(流複製是Oracle 9iR2中引入的一個非常吸引人的特性,支援異構資料庫之間的複製。10g中得到了完善)的支援。但是現在Oracle的流複製技術用得很少了,因為Oracle收購了Oracle golden gate,可以跨平臺,跨資料庫,Oracle現在主推這個,流複製就用得越來越少了。流池也是可選記憶體區,屬於SGA中的可變區。它的大小可以透過引數STREAMS_POOL_SIZE來指定。如果沒有被指定,流池大小預設為0,Oracle會在第一次使用流時自動建立,根據需要動態增加。

例子:檢視Java池和流池大小

SQL> select name,bytes/1024/1024 from v$sgainfo where name='Java Pool Size';

NAME                           BYTES/1024/1024

------------------------------ ---------------

Java Pool Size                               4

SQL> select name,bytes/1024/1024 from v$sgainfo where name='Streams Pool Size';

NAME                           BYTES/1024/1024

------------------------------ ---------------

Streams Pool Size                            4


9、重做日誌緩衝區

clipboard[8]

Oracle伺服器程式為每個DML或DDL語句從使用者記憶體空間複製重做條目到重做日誌緩衝區中。重做條目包含必要的由DDL和DML操作對資料庫進行改變的重建或重做資訊。這些資訊用於資料庫恢復,在緩衝區中佔用連續的空間。

重做日誌緩衝區是一個迴圈緩衝區;在重做日誌緩衝區中,伺服器程式可以在已被寫入磁碟的日誌緩衝區中複製新的條目。這需要LGWR程式快速寫出以確保空間可以用於新的重做條目。LGWR程式將重做日誌緩衝區寫入磁碟的聯機重做日誌檔案,複製自上次LGWR寫磁碟後進入到緩衝區的所有重做條目。

觸發LGWR寫的情形:

  • 當使用者程式提交事務時。
  • 每隔三秒,或當重做日誌緩衝區三分之一滿。
  • 當DBWn程式寫修改緩衝區到磁碟,如果對應的重做日誌資料尚未寫入磁碟。

例子:檢視重做日誌緩衝區大小

SQL> select name,bytes/1024 from v$sgainfo where name='Redo Buffers';

NAME                           BYTES/1024

------------------------------ ----------

Redo Buffers                         2316


10、自動記憶體管理:概覽

clipboard[9]

自動記憶體管理(AMM)允許Oracle資料庫自動調整SGA和PGA大小。在大多數平臺上,只需要設定目標記憶體大小初始化引數(memory_target)和最大記憶體大小初始化引數(memory_max_target),資料庫根據需要在SGA和PGA間動態調整記憶體。可以使EM啟用AMM:伺服器>記憶體顧問(資料庫配置部分)然後單擊“啟用”按鈕。

使用AMM,資料庫也會動態調整各個SGA元件和單個PGA的大小。

因為目標記憶體初始化引數是動態的,可以隨時更改目標記憶體大小而不需要重新啟動資料庫。最大記憶體作為目標記憶體的上限,防止目標記憶體設定太大。由於某些SGA元件不能輕易收縮或必須保持在一個最小值,資料庫還可以防止設定的目標記憶體太小。

這種間接的記憶體轉移依賴於作業系統釋放共享記憶體的機制。在記憶體被釋放到作業系統後,其他的元件可以透過從作業系統請求記憶體來分配記憶體。目前,自動記憶體管理支援Linux,Solaris,HPUX、AIX和Windows平臺。

例子:檢視目標記憶體和最大記憶體初始化引數

SQL> show parameter memory_target

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

memory_target                        big integer 800M

SQL> show parameter memory_max_target

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

memory_max_target                    big integer 800M


11、Oracle資料庫記憶體引數

clipboard[10]

上圖顯示了記憶體初始化引數層次結構。雖然可以只設定memory_target引數啟用自動記憶體管理,但仍然可以設定各種快取的最小值。

  • 如果sga_target和pga_aggregate_target設定為非零值,則分別是SGA和PGA的最小值。memory_target的值可以是從sga_target + pga_aggregate_target到memory_max_size。
  • 如果設定了sga_target,資料庫只自動調整SGA各元件的尺寸。PGA自動調整不依賴於是否對其進行了顯式設定。然而,整個SGA(sga_target)和PGA(pga_aggregate_target)不會進行自動調整,即不自動增大或收縮。

12、監控自動記憶體管理

clipboard[11]

從EM主頁(相關連結部分),導航到顧問中心>記憶體顧問。

自動記憶體管理啟用後,在記憶體顧問頁面的分配歷史區域可以看到記憶體元件大小的圖形化表示。在第一個直方圖的頂部是PGA,下部是SGA。第二個直方圖中的頂部是共享池大小,下部對應緩衝區快取。

在這個頁面上,還可以透過單擊“建議”按鈕訪問記憶體目標顧問。此顧問提供了各種總記憶體大小對應的資料庫時間改善。

注意:也可以使用V$MEMORY_TARGET_ADVISOR檢視檢視記憶體目標顧問。

clipboard[12]

clipboard[13]

clipboard[14]

clipboard[15]


13、監控自動記憶體管理

clipboard[16]

動態效能檢視V$memory_dynamic_components顯示所有動態調整記憶體元件的當前大小,包括SGA和PGA的大小。V$memory_target_advice檢視為memory_target初始化引數提供調優建議。

V$memory_target_advice檢視中memory_size_factor為1的行表示由memory_target設定的當前值以及完成當前工作負載所需的DB time。前面和後面的行,顯示另外的memory_target大小及其對應的大小因子以及對應的DB time。

SQL> select * from v$memory_target_advice;

MEMORY_SIZE MEMORY_SIZE_FACTOR ESTD_DB_TIME ESTD_DB_TIME_FACTOR    VERSION

----------- ------------------ ------------ ------------------- ----------

        400                 .5          698              1.0279          0

        600                .75          679              1.0005          0

        800                  1          679                   1          0

       1000               1.25          679                   1          0

       1200                1.5          679                   1          0

       1400               1.75          679                   1          0

       1600                  2          679                   1          0

7 rows selected.

SQL> select component,current_size,min_size,max_size,user_specified_size from v$memory_dynamic_components;

COMPONENT                      CURRENT_SIZE   MIN_SIZE   MAX_SIZE USER_SPECIFIED_SIZE

------------------------------ ------------ ---------- ---------- -------------------

shared pool                       209715200  138412032  209715200                   0

large pool                          8388608    8388608   71303168                   0

java pool                           4194304    4194304    4194304                   0

streams pool                        4194304          0    4194304                   0

SGA Target                        545259520  545259520  545259520                   0

DEFAULT buffer cache              310378496  310378496  381681664                   0

KEEP buffer cache                         0          0          0                   0

RECYCLE buffer cache                      0          0          0                   0

DEFAULT 2K buffer cache                   0          0          0                   0

DEFAULT 4K buffer cache                   0          0          0                   0

DEFAULT 8K buffer cache                   0          0          0                   0

COMPONENT                      CURRENT_SIZE   MIN_SIZE   MAX_SIZE USER_SPECIFIED_SIZE

------------------------------ ------------ ---------- ---------- -------------------

DEFAULT 16K buffer cache                  0          0          0                   0

DEFAULT 32K buffer cache                  0          0          0                   0

Shared IO Pool                            0          0          0                   0

PGA Target                        293601280  293601280  293601280                   0

ASM Buffer Cache                          0          0          0                   0

16 rows selected.

SQL> select component,parameter,initial_size,target_size,final_size from v$memory_resize_ops where initial_size<>final_size;

COMPONENT                      PARAMETER            INITIAL_SIZE TARGET_SIZE FINAL_SIZE

------------------------------ -------------------- ------------ ----------- ----------

DEFAULT buffer cache           db_cache_size                   0   322961408  322961408

SGA Target                     sga_target                      0   545259520  545259520

PGA Target                     pga_aggregate_target            0   293601280  293601280

java pool                      java_pool_size                  0     4194304    4194304

large pool                     large_pool_size                 0    71303168   71303168

shared pool                    shared_pool_size                0   138412032  138412032

streams pool                   streams_pool_size               0     4194304    4194304

DEFAULT buffer cache           db_cache_size           322961408   318767104  318767104

DEFAULT buffer cache           db_cache_size           318767104   381681664  381681664

large pool                     large_pool_size          71303168     8388608    8388608

shared pool                    shared_pool_size        138412032   142606336  142606336

COMPONENT                      PARAMETER            INITIAL_SIZE TARGET_SIZE FINAL_SIZE

------------------------------ -------------------- ------------ ----------- ----------

DEFAULT buffer cache           db_cache_size           381681664   377487360  377487360

shared pool                    shared_pool_size        142606336   146800640  146800640

DEFAULT buffer cache           db_cache_size           377487360   373293056  373293056

DEFAULT buffer cache           db_cache_size           373293056   369098752  369098752

shared pool                    shared_pool_size        146800640   150994944  150994944

DEFAULT buffer cache           db_cache_size           369098752   364904448  364904448

shared pool                    shared_pool_size        150994944   155189248  155189248

shared pool                    shared_pool_size        155189248   159383552  159383552

DEFAULT buffer cache           db_cache_size           364904448   360710144  360710144

DEFAULT buffer cache           db_cache_size           360710144   356515840  356515840

shared pool                    shared_pool_size        159383552   163577856  163577856

COMPONENT                      PARAMETER            INITIAL_SIZE TARGET_SIZE FINAL_SIZE

------------------------------ -------------------- ------------ ----------- ----------

DEFAULT buffer cache           db_cache_size           356515840   352321536  352321536

shared pool                    shared_pool_size        163577856   167772160  167772160

DEFAULT buffer cache           db_cache_size           352321536   343932928  343932928

shared pool                    shared_pool_size        167772160   176160768  176160768

shared pool                    shared_pool_size        176160768   184549376  184549376

DEFAULT buffer cache           db_cache_size           343932928   335544320  335544320

shared pool                    shared_pool_size        184549376   192937984  192937984

DEFAULT buffer cache           db_cache_size           335544320   327155712  327155712

shared pool                    shared_pool_size        192937984   201326592  201326592

DEFAULT buffer cache           db_cache_size           327155712   318767104  318767104

shared pool                    shared_pool_size        201326592   209715200  209715200

COMPONENT                      PARAMETER            INITIAL_SIZE TARGET_SIZE FINAL_SIZE

------------------------------ -------------------- ------------ ----------- ----------

DEFAULT buffer cache           db_cache_size           318767104   310378496  310378496

34 rows selected.


14、高效記憶體使用:指導

clipboard[17]

如果可能的話,最好是將SGA納入實體記憶體,因為實體記憶體提供了最快的訪問。作業系統可以提供額外的虛擬記憶體,但虛擬記憶體會經常被換出到磁碟。在一些平臺上,可以使用初始化引數lock_sga鎖定SGA到實體記憶體。但此引數不可與AMM或ASMM一起使用。

執行SQL語句時,資料塊請求讀或寫,或兩者有之。這被認為是一個邏輯I/O,當塊被請求時,會檢查該塊是否已經存在於記憶體中。如果不在記憶體中,從磁碟讀取,這就是所謂的物理I/O。在記憶體中找到塊的次數與邏輯I/O總數之比為緩衝區快取命中率。一個較高的比例意味著更多的塊在記憶體中找到,而不需要磁碟I/O。

緩衝快取記憶體命中率在99%以上很常見,但這並不總是意味著系統調優良好。如果經常執行一些不必要的查詢,不斷請求相同的塊,則命中率自然會提高。

此外,大全表掃描可以降低這個比例,因為可能會從磁碟讀取整個表;掃描可能不會使用已經在緩衝區快取中的一些塊。所以,如果應用程式中有一些必要的大全表掃描,資料庫可能總是有一個低的緩衝區快取命中率。

使用EM的記憶體顧問根據資料庫活動進行SGA大小的調整。


15、庫快取調優指導

clipboard[18]

庫快取作為共享池的一部分,儲存所有SQL,Java程式碼,PL/SQL儲存過程和包以及控制結構如鎖和庫快取斗柄。程式碼進入共享池以便可以在所有使用者之間共享,都可以利用已經處理的SQL資料。因此,無論語句執行多少次,有多少使用者去執行,只需要執行一次諸如解析SQL語句和確定資料訪問路徑(也被稱為“執行計劃”)的任務。如果庫快取太小,不能容納所有的執行語句,則不能利用共享SQL資料的優勢。如果庫快取太大則會加重系統管理其內容的負擔。

庫快取可能會有很多看起來不一樣但實際上是同一條語句的複製,一個常見的原因是這些語句只是有一些格式上的不同,字串沒有完全匹配。另一個原因是使用了字變數而沒有使用繫結變數。如果兩個語句只是字變數的值不一樣,則在大多數情況下,使用繫結變數替換字變數會提高效率。

CURSOR_SHARING初始化引數可以設定讓系統自動使用繫結變數替換字變數。通常情況下,應該利用這個設定作為臨時措施,直到應用程式在適當的時候使用繫結變數。但使用這個引數可能會導致其他的問題。

相比在應用程式中從不同地方發出相同的SQL語句,使用PL/SQL將語句放入到儲存過程,然後呼叫,這樣就只在一個位置了,確保了SQL語句的共享,且編譯該儲存過程時該SQL語句就進行了解析並有了執行計劃。

可以快取序列值,如果經常用到一些序列,建議為其設定快取值。

可以使用dbms_shared_pool包將物件固定到庫快取中,可以減少物件的重新載入和編譯。


16、自動共享記憶體管理:概覽

clipboard[19]

由於需要固定PGA而不能使用AMM,可以考慮使用自動共享記憶體管理(ASMM)簡化SGA的記憶體管理。使用SGA_TARGET初始化引數指定例項的SGA可用記憶體,資料庫自動調整SGA各元件。

例如,在一個系統中,白天執行聯機事務處理(OLTP)需要大的緩衝區快取,晚上執行並行批處理任務需要大的大池,需要同時配置緩衝區快取和大池以滿足其峰值要求。使用ASMM,OLTP工作執行時,緩衝區快取使用大部分記憶體以獲取良好的I/O效能。當資料分析和批處理工作啟動後,記憶體會自動遷移到大池中,這樣就可以使用並行查詢操作而不產生記憶體溢位錯誤。

透過使用伺服器引數檔案SPFILE,資料庫可以跨例項關閉和啟動來記錄自動調整元件的大小。但需要在例項啟動後去獲取工作負載特性。可以從過去的資訊開始,並繼續評估在最後一次關機時留下的工作量。


17、ASMM如何工作

clipboard[20]

自動共享記憶體管理是由兩個後臺程式來實現:Manageability Monitor(MMON)和Memory Manager(MMAN)。MMON定期捕獲統計資料和記憶體顧問資料。MMAN根據MMON調整各記憶體元件的大小。

基於工作負載資訊,自動共享記憶體管理:

  • 後臺定期捕獲統計資料。
  • 使用記憶體顧問。
  • 執行假設分析以確定最佳的記憶體分配。
  • 將記憶體移到最需要的地方。
  • 儲存各元件大小到SPFILE。

18、啟用自動共享記憶體管理

clipboard[21]

從手動的共享記憶體管理修改為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是上一步計算的值或者是所有SGA元件的和到SGA_MAX_SIZE之間的值。

(3)設定自動調整的SGA元件的值為0,可以透過編輯文字初始化引數檔案或者使用ALTER SYSTEM語句執行,根據需要重啟例項。

從自動記憶體管理修改為ASMM的步驟:

(1)設定MEMORY_TARGET初始化引數0。

ALTER SYSTEM SET MEMORY_TARGET = 0;

基於當前SGA記憶體分配設定SGA_TARGET。

(2)設定自動調整的SGA元件的值為0。完成後重啟例項。

例子:從自動記憶體管理修改為ASMM

SQL> select component,current_size/1024/1024 from v$memory_dynamic_components where component='SGA Target';

COMPONENT                      CURRENT_SIZE/1024/1024

------------------------------ ----------------------

SGA Target                                        520

SQL> alter system set memory_target=0;

System altered.

SQL> alter system set sga_target=520m;

System altered.

SQL> show parameter db_cache_size

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

db_cache_size                        big integer 0

SQL> show parameter pool_size

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

global_context_pool_size             string

java_pool_size                       big integer 0

large_pool_size                      big integer 0

olap_page_pool_size                  big integer 0

shared_pool_size                     big integer 0

streams_pool_size                    big integer 0

SQL> shutdown immediate

Database closed.

Database dismounted.

ORACLE instance shut down.

SQL> startup

ORACLE instance started.

Total System Global Area  542814208 bytes

Fixed Size                  2255032 bytes

Variable Size             213911368 bytes

Database Buffers          322961408 bytes

Redo Buffers                3686400 bytes

Database mounted.

Database opened.

clipboard[22]


19、禁用ASMM

clipboard[23]

可以設定SGA_TARGET為0禁用自動共享記憶體管理。在這種情況下,所有自動最佳化的引數的值設定為對應元件的當前值,即使使用者之前為自動最佳化的引數指定了一個非零值。

在上圖中,SGA_TARGET的值為8GB和SHARED_POOL_SIZE的值為1GB。如果系統內部調整共享池元件的大小為2GB,然後設定SGA_TARGET為0,結果SHARED_POOL_SIZE被設定為2 GB,覆蓋原來使用者指定的值。

例子:禁用ASMM

SQL> select component,current_size/1024/1024 from v$memory_dynamic_components;

COMPONENT                      CURRENT_SIZE/1024/1024

------------------------------ ----------------------

shared pool                                       140

large pool                                          8

java pool                                           4

streams pool                                        4

SGA Target                                        520

DEFAULT buffer cache                              356

KEEP buffer cache                                   0

RECYCLE buffer cache                                0

DEFAULT 2K buffer cache                             0

DEFAULT 4K buffer cache                             0

DEFAULT 8K buffer cache                             0

COMPONENT                      CURRENT_SIZE/1024/1024

------------------------------ ----------------------

DEFAULT 16K buffer cache                            0

DEFAULT 32K buffer cache                            0

Shared IO Pool                                      0

PGA Target                                        280

ASM Buffer Cache                                    0

16 rows selected.

SQL> show parameter pool_size

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

global_context_pool_size             string

java_pool_size                       big integer 0

large_pool_size                      big integer 0

olap_page_pool_size                  big integer 0

shared_pool_size                     big integer 0

streams_pool_size                    big integer 0

SQL> show parameter db_cache_size

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

db_cache_size                        big integer 0

SQL> alter system set sga_target=0;

System altered.

SQL> show parameter pool_size

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

_shared_io_pool_size                 big integer 0

global_context_pool_size             string

java_pool_size                       big integer 4M

large_pool_size                      big integer 8M

olap_page_pool_size                  big integer 0

shared_pool_size                     big integer 140M

streams_pool_size                    big integer 4M

SQL> show parameter db_cache_size

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

db_cache_size                        big integer 356M

clipboard[24]


20、PGA

clipboard[25]

程式全域性區(PGA)是一個記憶體區,包含伺服器程式的資料和控制資訊,是在伺服器程式啟動時伺服器建立的非共享記憶體。為例項所有伺服器程式分配的總的PGA記憶體稱為aggregated PGA。

如果使用共享伺服器模式,一部分PGA位於SGA中。

PGA記憶體通常包含以下幾部分:

(1)私有SQL區

私有SQL區包含諸如繫結資訊和執行時記憶體結構的資料。這些資料對應於每個會話呼叫的SQL語句;繫結變數持有不同的值,遊標狀態也不一樣。執行SQL語句的每一個會話都有一私有SQL區,每個提交了相同SQL語句的使用者都有其自己的私有SQL區,使用一個共享SQL區。因此,許多私有SQL區可以對應一個相同的共享SQL區。私有SQL區的位置取決於建立會話連線的型別。如果會話是透過專有伺服器建立連線,私有SQL區位於伺服器程式的PGA。如果會話是透過共享伺服器建立連線,私有SQL區的一部分被位於在SGA。

(2)遊標和SQL區

一個Oracle Pro*C程式或Oracle呼叫介面(OCI)程式的應用開發者可以顯式開啟遊標或處理特定的私有SQL區,在程式執行期間使用她們作為資源命名。資料庫為一些SQL語句隱式使用的遞迴遊標也使用共享SQL區。

(3)工作區域(Work Area)

對於複雜的查詢(例如決策支援查詢),PGA的很大一部分是專門用於記憶體密集型操作的工作區。如:

  • 基於排序的操作,如ORDER BY,GROUP BY,ROLLUP和視窗函式
  • Hash-join
  • 點陣圖合併(Bitmap merge)
  • 點陣圖建立(Bitmap create)
  • 大負載操作的寫緩衝區

排序運算子使用工作區(排序區)來執行記憶體排序。類似地,一個雜湊連線運算子使用工作區(雜湊區)從左端構建雜湊表。

可以控制和調整工作區的大小。一般情況下,較大的工作區可以顯著提高消耗大量記憶體的特定操作的效能。

(4)會話記憶體(Session Memory)

會話記憶體是分配給會話變數(登入資訊)和與會話相關的其他資訊的記憶體。對於一個共享伺服器,會話記憶體是共享的。

自動PGA記憶體管理

預設情況下,Oracle資料庫自動管理分配給例項PGA的總量。可以透過設定初始化引數PGA_AGGREGATE_TARGET來控制總量大小。Oracle資料庫確保PGA記憶體分配給所有資料庫伺服器程式和後臺程式的總量不超過這個值。


21、使用V$PARAMETER引數

clipboard[26]

當為SGA_TARGET指定一個非零值,且不指定自動調優的SGA元件的值,則在V$PARAMETER檢視中這些元件的值都為0,ISDEFAULT欄位的值都是TRUE。

如果為自動調優的SGA元件的指定了值,則在V$PARAMETER檢視中顯示指定的值。

SQL> select name,value,isdefault from v$parameter where name like '%pool_size';

NAME                           VALUE      ISDEFAULT

------------------------------ ---------- ---------

shared_pool_size               146800640  TRUE

large_pool_size                8388608    TRUE

java_pool_size                 4194304    TRUE

streams_pool_size              4194304    TRUE

_shared_io_pool_size           0          TRUE

global_context_pool_size                  TRUE

olap_page_pool_size            0          TRUE

7 rows selected.


相關習題:

(1)Which two initialization parameters would you set to enable Automatic Shared Memory Management? (Choose two.)

A.set SHARED_POOL_SIZE to zero

B.set STATISTICS_LEVEL to BASIC

C.set SGA_TARGET to a non-zero value

D.set DB_CACHE_SIZE to a non-zero value

E.set STATISTICS_LEVEL to TYPICAL or ALL

答案:AC

(2)Your database interface is running. A user SCOTT starts a SQL *Plus session, and issues the following query:

SQL> SELECT * FROM sales;

Which process would retrieve the result from the database and return it to the client program?

A.User process

B.Server process

C.System Monitor (SMON)

D.Process Monitor (PMON)

E.Checkpoint process (CKPT)

答案:B

(3)Exhibit: View the Exhibit to examine the parameter values. You are planning to set the value for

the MEMORY_TARGET parameter of your database instance. What value would you assign?

此主題相關圖片如下:

clipboard[27]

A.  1440 MB

B.  90 MB

C.  362 MB

D.  272 MB

答案:C

(4)Which statements about the MEMORY_TARGET initialization parameter are true? (Choose all that apply.)

A.  MEMORY_TARGET can be increased up to the value of MEMORY_MAX_TARGET, if MEMORY_MAX_TARGET is set to a value greater than zero

B.  MEMORY_MAX_TARGET defaults to a value of zero if MEMORY_TARGET is not set

C.  MEMORY_TARGET represents the total amount of memory that can be allocated to SGA and PGA memory structures.

D.  MEMORY_TARGET is static and cannot be modified without shutting down the instance

答案:ABC

(5)此主題相關圖片如下:
clipboard[28]

View the Exhibit to examine the output produced by the following query at three different times since the database instance started and has undergone workloads of different capacities:

SQL> SELECT substr(component, 0, 10) COMP, current_size CS,

user_specified_size US

FROM v$memory_dynamic_components

WHERE current_size!=0;

What do you infer from this?

A.  All sessions are connected to the database instance in dedicated mode, and no RMAN or parallel query operations have been performed.

B.  The database instance is running with manual shared memory management.

C.  The database instance is running with manual PGA management.

D.  The database instance has the MEMORY_TARGET value set to a nonzero value.

答案:D

(6)View the Exhibit to observe the error.

此主題相關圖片如下:
clipboard[29]

You receive this error regularly and have to shut down the database instance to overcome the error. What can the solution be to reduce the chance of this error in future, when implemented?

A.  setting the PRE_PAGE_SGA parameter to TRUE

B.  locking the SGA in memory

C.  increasing the value of SGA_MAX_SIZE

D.  automatic memory management

答案:D

(7)What Oracle process runs when the database is in ARCHIVELOG mode but not when it is in NOARCHIVELOG mode?

A.  MMON

B.  LGWR

C.  ARCH

D.  ARWR

E.  COPY

答案:C

(8)You specify a nonzero value for the MEMORY_TARGET initialization parameter, but do not set the PGA_AGGREGATE_TARGET or the SGA_TARGET parameters. You restart your database instance. Which statement about the result is true?

A.  The database instance starts, and Oracle sets the default value of SGA_TARGET to the same value as SGA_MAX_SIZE.

B.  The database instance starts, and Oracle automatically tunes memory and allocates 60 percent to the SGA and 40 percent to the PGA.

C.  The database instance starts, but Automatic Memory Management is disabled.

D.  The database instance will not start because you did not specify the PGA_AGGREGATE_TARGET or SGA_TARGET parameter.

答案:B

(9)Note the following parameters settings in your database:

SGA_MAX_SIZE = 1024M

SGA_TARGET = 700M

DB_8K_CACHE_SIZE = 124M

LOG_BUFFER = 200M

You issued the following command to increase the value of DB_8K_CACHE_SIZE:

SQL> ALTER SYSTEM SET DB_8K_CACHE_SIZE=140M;

What would happen?

A.  It will fail because DB_8K_CACHE_SIZE parameter cannot be changed dynamically

B.  It will be successful only if the memory is available from the auto tuned components

C.  It will fail because an increase in DB_8K_CACHE_SIZE cannot be accommodated within SGA_TARGET

D.  It will fail because an increase in the DB_8K_CACHE_SIZE cannot be accommodated within SGA_MAX_SIZE

答案:D

(10)You set the following parameters in the parameter file and restarted the database:

MEMORY_MAX_TARGET=0

MEMORY_TARGET=500M

PGA_AGGREGATE_TARGET=90M

SGA_TARGET=270M

Which two statements are true regarding these parameters after the database instance is restarted? (Choose two.)

A.  The MEMORY_MAX_TARGET parameter is automatically set to 500 MB.

B.  The value of the MEMORY_MAX_TARGET parameter remains zero till it is changed manually.

C.  The PGA_AGGREGATE_TARGET and SGA_TARGET parameters are automatically set to zero.

D.  The lower bounds of PGA_AGGREGATE_TARGET and SGA_TARGET parameters are set to 90 MB and 270 MB, respectively.

答案:AD

(11)Which of the following Oracle features is enabled by setting a nonzero value for the MEMORY_TARGET initialization parameter?

A.  Automatic PGA Memory Management

B.  Automatic SGA Memory Management

C.  Automatic Shared Memory Management

D.  Automatic Memory Management

E.  Manual SGA Memory Management

F.  None of the above

答案:D

(12)By setting the value of MEMORY_TARGET to zero and setting the value of SGA_TARGET to a nonzero value, you will enable which of the following memory-management options?

A.  Automatic PGA Memory Management

B.  Automatic SGA Memory Management

C.  Automatic Shared Memory Management

D.  Automatic Memory Management

E.  Manual SGA Memory Management

F.  None of the above

答案:C

(13)For Oracle 11g, Oracle strongly recommends that you configure your database to use which of the following memory-management features?

A.  Automatic PGA Memory Management

B.  Automatic SGA Memory Management

C.  Automatic Shared Memory Management

D.  Automatic Memory Management

E.  Manual SGA Memory Management

F.  None of the above

答案:D

(14)To manually configure the SGA components using Oracle Enterprise Manager Memory Advisor, you can set values for which of the following initialization parameters? (Choose all that apply.)

A.  DB_CACHE_SIZE

B.  SHARED_POOL_SIZE

C.  LARGE_POOL_SIZE

D.  JAVA_POOL_SIZE

E.  SGA_MAX_SIZE

F.  SORT_AREA_SIZE

答案:ABCD

(15)When manually configuring the SGA, which of the following parameter changes requires an instance restart to take effect?

A.  DB_CACHE_SIZE

B.  SHARED_POOL_SIZE

C.  LARGE_POOL_SIZE

D.  JAVA_POOL_SIZE

E.  SGA_MAX_SIZE

F.  SORT_AREA_SIZE

答案:E

(16)Using Oracle Enterprise Manager to set SGA pool values manually, for which of the following pools does Oracle EM offer advice to set the value appropriately? (Choose all that apply.)

A.  DB_CACHE_SIZE

B.  SHARED_POOL_SIZE

C.  LARGE_POOL_SIZE

D.  JAVA_POOL_SIZE

E.  SGA_MAX_SIZE

F.  SORT_AREA_SIZE

答案:AB

(17)In Oracle 11g, by default which one of the following conditions implicitly enables Automatic PGA Memory Management?

A.  Setting a nonzero value for SGA_TARGET

B.  Configuring Automatic Shared Memory Management

C.  Configuring Automatic Memory Management

D.  Setting a nonzero value for SGA_MAX_SIZE and PGA_AGGREGATE_TARGET

E.  None of the above

答案:B

(18)Automatic PGA Memory Management eliminates the need to manually configure which of the following initialization parameters? (Choose all that apply.)

A.  SORT_AREA_SIZE

B.  HASH_AREA_SIZE

C.  BITMAP_MERGE_AREA_SIZE

D.  CREATE_BITMAP_AREA_SIZE

E.  PGA_AGGREGATE_TARGET

答案:ABCD

(19)When tuning Automatic PGA Memory Management, which of the following views will provide the information specified?

A.  The V$PGA_TARGET_ADVICE view shows the predicted cache hit-ratio improvement if you increase PGA_AGGREGATE_TARGET.

B.  The V$PGA_TARGET_ADVICE view shows how the V$SQL_WORKAREA histogram will change if you change the value of PGA_AGGREGATE_TARGET.

C.  The V$PGA_TARGET_ADVICE_HISTOGRAM view shows how the

V$SQL_WORKAREA_HISTOGRAM will change if you switch between Manual and Automatic PGA Memory Management.

D.  The V$PGA_TARGET_ADVICE view shows how performance will improve for the different work areas if you switch from Manual to Automatic PGA Memory Management.

答案:A

(20)Examine the exhibit to view the parameters set in your parameter file. (Click the Exhibit(s) button.)

You restart the instance.

To what value will the MEMORY_MAX_TARGET parameter be set by default?

A. 120M

B. 320M

C. 480M

D. 600M

答案:D

(21)Which statement about Automatic Memory Management with Oracle 11g is true?

A.  You cannot specify MEMORY_TARGET if you explicitly specify SGA_TARGET or PGA_AGGREGATE_ TARGET values that are greater than zero in your parameter file.

B.  Oracle can reallocate memory between the SGA and PGA automatically as needed.

C.  To use Automatic Memory Management, you must explicitly set both the MEMORY_TARGET and MEMORY_MAX_TARGET parameters in your parameter file.

D.  You can set the MEMORY_TARGET parameter to a maximum value of the current SGA size plus the current PGA size.

答案:B

(22)The DBA has chosen to manage SGA and PGA memory separately in an OLTP database because of his unique knowledge of the application. Which of these are good starting points to use when configuring the maximum values for SGA and PGA, based on the amount of memory available on the system?

A.  20% SGA, 80% PGA

B.  25% SGA, 75% PGA

C.  50% SGA, 50% PGA

D.  75% SGA, 25% PGA

E.  80% SGA, 20% PGA

答案:E

(23)Note the following parameter settings:

png此主題相關圖片如下:
clipboard[30]

Which setting is NOT allowed?

A.  ALTER SYSTEM SET DB_CACHE_SIZE=50M;

B.  ALTER SYSTEM SET DB_8K_CACHE_SIZE=10M;

C.  ALTER SYSTEM SET DB_4K_CACHE_SIZE=10M;

D.  ALTER SYSTEM SET DB_16K_CACHE_SIZE=10M;

答案:B

(24)You want to enable automatic PGA memory management in your database. Which setting is required to achieve this?

A.  Set MEMORY_TARGET to zero

B.  Set the STATISTICS_LEVEL parameter to BASIC

C.  Set the WORKAREA_SIZE_POLICY parameter to MANUAL

D.  Set the PGA_AGGREGATE_TARGET parameter to nonzero value

答案:D

(25)Examine the parameter setting in your database:

此主題相關圖片如下:
clipboard[31]

Which statement is correct about the database?

A.  Automatic memory management is disabled because PGA_AGGREGATE_TARGET and SGA_TARGET are not set

B.  The instance is started but the database will not be opened until PGA_AGGREGATE_TARGET and SGA_TARGET are set

C.  The database is opened but users cannot perform transactions until PGA_AGGREGATE_TARGET and SGA_TARGET are set

D.  Automatic memory management is enabled and, as per policy, 60% of the memory for System Global Area (SGA) and 40% of the memory for Program Global Area (PGA) will be distributed at startup

答案:D

(26)View the Exhibit to observe the error.

此主題相關圖片如下:
clipboard[32]

You receive this error regularly and have to shutdown the database instance to overcome the error. Automatic Shared Memory Management is configured for the instance. What can you do to reduce the chance of this error in the future?

A.  Increase the value of SGA_MAX_SIZE

B.  Enable automatic memory management        

C.  Set the PRE_PAGE_SGA parameter to true

D.  Lock the System Global Area (SGA) in memory

答案:B

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28536251/viewspace-2120680/,如需轉載,請註明出處,否則將追究法律責任。

相關文章