pga_aggregate_target和_pga_max_size都不能絕對限制實際PGA的使用
和sga_target不同,pga_aggregate_target並不能限制PGA的大小。 另一個差別是,SGA是資料庫啟動時按照sga_max_size預先分配的,而PGA則是“按需分配”的。
以下詳細解釋下,為什麼pga_aggregate_target並不能限制PGA的大小。一般的文件會把PGA分為stack space和UGA兩個部分,但這種提法太籠統,不利於我們理解這個問題。我們把它分為work area和work area之外的部分。
所謂work area,就是session要執行SQL,需要在資料庫內部分配的,為了存放中間結果的記憶體。 比如sort area,為了排序用的記憶體,比如hash area,為了hash join用的記憶體,這一部分直接和SQL執行相關,影響SQL執行的效率,比如更大hash area會讓hash join更快。pga_aggregate_target實際上只限制work area的大小。當work area達到pga_aggregate_target的限制,則會產生4030錯誤。隱含引數_pga_max_size只是限制單個程式使用的work area大小,也是在pga_aggregate_target的限制之內的更小限制。而work area之外的記憶體,不被pga_aggregate_target和_pga_max_size所限制。所以你經常會看到PGA的大小超過了pga_aggregate_target。這通常是因為PL/SQL中的變數和陣列中裝入了巨大的資料造成的。通常的例子是bulk collect,imp/exp,sql loader等工具也會產生類似的問題。
我下面給出一個具體的示例:
alter system set "_pga_max_size"=10m scope=both;
alter system set pga_aggregate_target=100m scope=both;
SQL> shutdown immediate
startup
SQL> select ksppinm as "hidden parameter", ksppstvl as "value" from x$ksppi join x$ksppcv using (indx) where ksppinm like '%_pga_max_size%' order by ksppinm;
hidden parameter
--------------------------------------------------------------------------------
value
--------------------------------------------------------------------------------
_pga_max_size
10485760
<=========限制單個程式使用PGA 100M(其實是work area)
執行一個PL/SQL,使用bulk collect使其記憶體使用大大超過pga_aggregate_target和_pga_max_size:
DECLARE
CURSOR c1 IS
SELECT *
FROM oracle.employees;
TYPE emp_row IS TABLE OF c1%ROWTYPE;
table_set emp_row;
BEGIN
-- Assign values to nested table of records:
SELECT *
BULK COLLECT INTO table_set
FROM oracle.employees;
-- Print nested table of records:
FOR i IN table_set.FIRST .. table_set.LAST LOOP
DBMS_OUTPUT.PUT_LINE (
table_set(i).email || ' ' ||
table_set(i).last_name || ', ' ||
table_set(i).first_name
);
END LOOP;END;
/
select pid,spid,program,pga_used_mem/1024/1024,pga_alloc_mem/1024/1024 from v$process
where spid=3735758
PID SPID PROGRAM PGA_USED_MEM/1024/1024 PGA_ALLOC_MEM/1024/1024
--- ------------ ------------------------------------------------ ---------------------- -----------------------
19 3735758 oracle@nascds5 (TNS V1-V3) 616.22734165191650390625 616.63962650299072265625
《=========PGA使用了600M
select a.name,to_char(b.value,'999,999,999') value
from v$statname a,v$mystat b
where a.statistic# = b.statistic#
and a.name like '%ga memory%';
NAME VALUE
---------------------------------------------------------------- ------------
session uga memory 1,896,024
session uga memory max 1,896,024
session pga memory 2,330,120
session pga memory max 647,400,968 <==========Peak PGA size for the session. 647,400,968
12c新追加了一個引數PGA_AGGREGATE_LIMIT來限制PGA的大小:
Limiting process size with database parameter PGA_AGGREGATE_LIMIT (Doc ID 1520324.1)
以下詳細解釋下,為什麼pga_aggregate_target並不能限制PGA的大小。一般的文件會把PGA分為stack space和UGA兩個部分,但這種提法太籠統,不利於我們理解這個問題。我們把它分為work area和work area之外的部分。
所謂work area,就是session要執行SQL,需要在資料庫內部分配的,為了存放中間結果的記憶體。 比如sort area,為了排序用的記憶體,比如hash area,為了hash join用的記憶體,這一部分直接和SQL執行相關,影響SQL執行的效率,比如更大hash area會讓hash join更快。pga_aggregate_target實際上只限制work area的大小。當work area達到pga_aggregate_target的限制,則會產生4030錯誤。隱含引數_pga_max_size只是限制單個程式使用的work area大小,也是在pga_aggregate_target的限制之內的更小限制。而work area之外的記憶體,不被pga_aggregate_target和_pga_max_size所限制。所以你經常會看到PGA的大小超過了pga_aggregate_target。這通常是因為PL/SQL中的變數和陣列中裝入了巨大的資料造成的。通常的例子是bulk collect,imp/exp,sql loader等工具也會產生類似的問題。
我下面給出一個具體的示例:
alter system set "_pga_max_size"=10m scope=both;
alter system set pga_aggregate_target=100m scope=both;
SQL> shutdown immediate
startup
SQL> select ksppinm as "hidden parameter", ksppstvl as "value" from x$ksppi join x$ksppcv using (indx) where ksppinm like '%_pga_max_size%' order by ksppinm;
hidden parameter
--------------------------------------------------------------------------------
value
--------------------------------------------------------------------------------
_pga_max_size
10485760
<=========限制單個程式使用PGA 100M(其實是work area)
執行一個PL/SQL,使用bulk collect使其記憶體使用大大超過pga_aggregate_target和_pga_max_size:
DECLARE
CURSOR c1 IS
SELECT *
FROM oracle.employees;
TYPE emp_row IS TABLE OF c1%ROWTYPE;
table_set emp_row;
BEGIN
-- Assign values to nested table of records:
SELECT *
BULK COLLECT INTO table_set
FROM oracle.employees;
-- Print nested table of records:
FOR i IN table_set.FIRST .. table_set.LAST LOOP
DBMS_OUTPUT.PUT_LINE (
table_set(i).email || ' ' ||
table_set(i).last_name || ', ' ||
table_set(i).first_name
);
END LOOP;END;
/
select pid,spid,program,pga_used_mem/1024/1024,pga_alloc_mem/1024/1024 from v$process
where spid=3735758
PID SPID PROGRAM PGA_USED_MEM/1024/1024 PGA_ALLOC_MEM/1024/1024
--- ------------ ------------------------------------------------ ---------------------- -----------------------
19 3735758 oracle@nascds5 (TNS V1-V3) 616.22734165191650390625 616.63962650299072265625
《=========PGA使用了600M
select a.name,to_char(b.value,'999,999,999') value
from v$statname a,v$mystat b
where a.statistic# = b.statistic#
and a.name like '%ga memory%';
NAME VALUE
---------------------------------------------------------------- ------------
session uga memory 1,896,024
session uga memory max 1,896,024
session pga memory 2,330,120
session pga memory max 647,400,968 <==========Peak PGA size for the session. 647,400,968
12c新追加了一個引數PGA_AGGREGATE_LIMIT來限制PGA的大小:
Limiting process size with database parameter PGA_AGGREGATE_LIMIT (Doc ID 1520324.1)
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/15498/viewspace-1878363/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- pga_aggregate_target和_pga_max_size都不能絕對限制實際PGA的使用--ora04030
- 【TUNE_ORACLE】PGA_AGGREGATE_LIMIT詳解(一)PGA_AGGREGATE_TARGET的限制OracleMIT
- pga_aggregate_target 相關總結 -- Oracle PGAOracle
- 認識PGA及PGA_AGGREGATE_TARGET [final]
- How To Tune PGA_AGGREGATE_TARGET
- pga_aggregate_target的設定 (zt)
- PGA的實際管理,設定和最佳化
- 關於PGA_AGGREGATE_TARGET的引數說明
- Tuning PGA_AGGREGATE_TARGET in Oracle 9iOracle
- 對SGA和PGA的優化建議優化
- Oracle資料庫work area size & pga_aggregate_target引數Oracle資料庫
- Granules of pga_aggregate_target 494 cannot be more than memory_target (497)
- 【PROFILE】使用Oracle的PROFILE對使用者資源限制和密碼限制的研究與探索Oracle密碼
- memory_max_target,memory_target,pga_aggregate_target,sga_target
- Oracle PGA記憶體的配置和使用Oracle記憶體
- [轉載] 使用Oracle的PROFILE對使用者資源限制和密碼限制的研究與探索Oracle密碼
- oracle12c新特性(9)--限制PGA的大小Oracle
- 【例項】之memory_target、sga_target,pga_aggregate_target關係
- 關於CSS中的定位使用子絕父相(子類絕對位置和父類相對位置)CSS
- css絕對定位和相對定位的差別CSS
- 絕對路徑和相對路徑的區別,
- 絕對路徑和相對路徑的區別
- c#實現的破解程式--針對軟體使用時間限制C#
- 絕對定位實現全屏效果
- 11g MEMORY_TARGET 引數對SGA 和PGA的影響
- 11g MEMORY_TARGET 引數對SGA 和PGA的影響
- 絕對定位使用margin:0 auto居中
- 檔案絕對路徑和相對路徑
- Jsp相對路徑和絕對路徑JS
- MySQL版本對varchar的定義和限制條件MySql
- webpack的css,less,sass中使用絕對路徑WebCSS
- JSP 和 Servlet 中的絕對路徑和相對路徑問題JSServlet
- pga使用的一些資料
- 1-相對定位、絕對定位和固定定位的區別
- VSFTP針對不同的使用者限制不同的速度FTP
- profile對密碼的限制密碼
- html中的路徑的介紹:絕對路徑和相對路徑HTML
- 查詢SGA和PGA大小