Oracle Pga Usage History

 
Customer RecommendedHow to Find Top sql_id's That Consume PGA and Temporary Segments Most from ASH (Doc ID 2516606.1)

 
Top sql_id's that consumed PGA: 

select *
from (select instance_number, sql_id, max(pga_sum_mb) pga_max
        from (select instance_number, sample_time, sql_id, round(sum(nvl(pga_allocated, 0))/1024/1024) pga_sum_mb
                from dba_hist_active_sess_history
               where sample_time between to_timestamp('&begin_timestamp', 'yyyy/mm/dd hh24:mi') and to_timestamp('&end_timestamp', 'yyyy/mm/dd hh24:mi')
            group by instance_number, sample_time, sql_id)
       group by instance_number, sql_id
       order by pga_max desc)
where rownum <= 10;




Top sql_id's that consumed temporary segments: 

select *
from (select instance_number, sql_id, max(temp_sum_mb) temp_max
        from (select instance_number, sample_time, sql_id, round(sum(nvl(temp_space_allocated, 0))/1024/1024) temp_sum_mb
                from dba_hist_active_sess_history
               where sample_time between to_timestamp('&begin_timestamp', 'yyyy/mm/dd hh24:mi') and to_timestamp('&end_timestamp', 'yyyy/mm/dd hh24:mi')
            group by instance_number, sample_time, sql_id)
       group by instance_number, sql_id
       order by temp_max desc)
where rownum <= 10;  




New 1 

WITH 
pga_data as
(
  SELECT /*+ MATERIALIZED */
      sample_time,    
      nvl(sum(ash.pga_allocated/1024/1024),0) AS sum_pga_mb
    FROM
      dba_hist_active_sess_history ash,
      dba_users u
   WHERE ash.user_id = u.user_id
     AND u.username  LIKE :username
     AND sample_time > SYSDATE-:n_days
     AND sample_time < SYSDATE
  GROUP BY action, sample_time
),
cal_data AS
(
  SELECT
    trunc(SYSDATE, 'MI') - (LEVEL/(24*60)*:per_mins)     AS date_min,
    trunc(SYSDATE, 'MI') - ((LEVEL-1)/(24*60)*:per_mins) AS date_max
  FROM dual 
  CONNECT BY LEVEL < (24*60*:n_days/:per_mins)+1
  ORDER BY date_min
)
SELECT /*+ NO_MERGE(h) NO_MERGE(c) */
    to_char(c.date_min, 'YYYY-MM-DD HH24:MI:SS') date_min,
    trunc(nvl(avg(sum_pga_mb),0), 2) avg_pga_mb,
    trunc(nvl(min(sum_pga_mb),0), 2) min_pga_mb,
    trunc(nvl(max(sum_pga_mb),0), 2) max_pga_mb
  FROM
    pga_data h,
    cal_data c
 WHERE h.sample_time (+) >= c.date_min
   AND h.sample_time (+) <  c.date_max
GROUP BY c.date_min;












username – usernames that uses PGA
n_days – defines how many n-days is reported since today
per_mins – defines granularity of each snapshot in minutes. Smaller granularity more precise report – more records.



WITH 
pga_data as
(
  SELECT /*+ MATERIALIZED */
      sample_time,    
      nvl(sum(ash.pga_allocated/1024/1024),0) AS sum_pga_mb
    FROM
      dba_hist_active_sess_history ash,
      dba_users u
   WHERE ash.user_id = u.user_id
     AND u.username  LIKE :username
     AND sample_time > SYSDATE-:n_days
     AND sample_time < SYSDATE
  GROUP BY action, sample_time
),
cal_data AS
(
  SELECT
    trunc(SYSDATE, 'MI') - (LEVEL/(24*60)*:per_mins)     AS date_min,
    trunc(SYSDATE, 'MI') - ((LEVEL-1)/(24*60)*:per_mins) AS date_max
  FROM dual 
  CONNECT BY LEVEL < (24*60*:n_days/:per_mins)+1
  ORDER BY date_min
)
SELECT /*+ NO_MERGE(h) NO_MERGE(c) */
    to_char(c.date_min, 'YYYY-MM-DD HH24:MI:SS') date_min,
    trunc(nvl(avg(sum_pga_mb),0), 2) avg_pga_mb,
    trunc(nvl(min(sum_pga_mb),0), 2) min_pga_mb,
    trunc(nvl(max(sum_pga_mb),0), 2) max_pga_mb
  FROM
    pga_data h,
    cal_data c
 WHERE h.sample_time (+) >= c.date_min
   AND h.sample_time (+) <  c.date_max
GROUP BY c.date_min;





EG

WITH 
pga_data as
(
  SELECT /*+ MATERIALIZED */
      sample_time,    
      nvl(sum(ash.pga_allocated/1024/1024),0) AS sum_pga_mb
    FROM
      dba_hist_active_sess_history ash,
      dba_users u
   WHERE ash.user_id = u.user_id
     AND sample_time > SYSDATE-10
     AND sample_time < SYSDATE
  GROUP BY action, sample_time
),
cal_data AS
(
  SELECT
    trunc(SYSDATE, 'MI') - (LEVEL/(24*60)*30)     AS date_min,
    trunc(SYSDATE, 'MI') - ((LEVEL-1)/(24*60)*30) AS date_max
  FROM dual 
  CONNECT BY LEVEL < (24*60*10/30)+1
  ORDER BY date_min
)
SELECT /*+ NO_MERGE(h) NO_MERGE(c) */
    to_char(c.date_min, 'YYYY-MM-DD HH24:MI:SS') date_min,
    trunc(nvl(avg(sum_pga_mb),0), 2) avg_pga_mb,
    trunc(nvl(min(sum_pga_mb),0), 2) min_pga_mb,
    trunc(nvl(max(sum_pga_mb),0), 2) max_pga_mb
  FROM
    pga_data h,
    cal_data c
 WHERE h.sample_time (+) >= c.date_min
   AND h.sample_time (+) <  c.date_max
GROUP BY c.date_min;
 


Option 2 : 

SELECT sn.INSTANCE_NUMBER,
sga.allo sga,
pga.allo pga,
(sga.allo + pga.allo) tot,
TRUNC (SN.END_INTERVAL_TIME, 'mi') time
FROM ( SELECT snap_id, INSTANCE_NUMBER, ROUND (SUM (bytes) / 1024 / 1024 / 1024, 3) allo
FROM DBA_HIST_SGASTAT
GROUP BY snap_id, INSTANCE_NUMBER) sga,
( SELECT snap_id, INSTANCE_NUMBER, ROUND (SUM (VALUE) / 1024 / 1024 / 1024, 3) allo
FROM DBA_HIST_PGASTAT
WHERE name = 'total PGA allocated'
GROUP BY snap_id, INSTANCE_NUMBER) pga,
dba_hist_snapshot sn
WHERE sn.snap_id = sga.snap_id
AND sn.INSTANCE_NUMBER = sga.INSTANCE_NUMBER
AND sn.snap_id = pga.snap_id
AND sn.INSTANCE_NUMBER = pga.INSTANCE_NUMBER
-- SN.END_INTERVAL_TIME between to_date(:begin_time,'DD_MON_YYYY_hh24_mi')-65/1440 and to_date(:end_time,'DD_MON_YYYY_hh24_mi')+5/1440    
ORDER BY sn.snap_id DESC, sn.INSTANCE_NUMBER;

or

SELECT
    snap_id,
    begin_interval_time,
    end_interval_time,
    max_pga_used_mem / 1024 / 1024 AS max_pga_used_mb,
    pga_cache_hit_percentage,
    pga_cache_miss_percentage
FROM
    dba_hist_pgastat
JOIN
    dba_hist_snapshot USING (snap_id)
WHERE
    begin_interval_time BETWEEN TO_DATE('2024-01-01', 'YYYY-MM-DD') AND TO_DATE('2024-01-31', 'YYYY-MM-DD')
ORDER BY
    snap_id;


Or 


SELECT 
    s.sql_id,
    s.plan_hash_value,
    s.module,
    s.action,
    s.parsing_schema_name,
    ROUND(SUM(pg.max_pga_used_mem) / 1024 / 1024, 2) AS total_pga_used_mb
FROM 
    dba_hist_sqlstat s
JOIN 
    dba_hist_pgastat pg ON s.sql_id = pg.sql_id
WHERE 
    s.parsing_schema_name NOT IN ('SYS')
GROUP BY 
    s.sql_id,
    s.plan_hash_value,
    s.module,
    s.action,
    s.parsing_schema_name
ORDER BY 
    total_pga_used_mb DESC;

or 

SELECT 
    ash.session_id AS sid,
    SUM(pga.max_pga_used_mem) / 1024 / 1024 AS total_pga_used_mb
FROM 
    dba_hist_active_sess_history ash
JOIN 
    dba_hist_pgastat pga ON ash.sample_time = pga.snap_time
WHERE 
    ash.session_type = 'FOREGROUND'
GROUP BY 
    ash.session_id
ORDER BY 
    total_pga_used_mb DESC;




Option 3:

set line 200
col obejct_name format a40
col sql_id format a20
SELECT
TO_CHAR(ASH.SAMPLE_TIME, 'YYYY-MM-DD HH24:MI:SS') SAMPLE_TIME,
ASH.SESSION_ID,
ASH.BLOCKING_SESSION,
O.OBJECT_NAME,
S.SQL_id , nvl ( ash.pga_allocated/1024/1024/1024 , 0) AS SUM_PGA_MB 
FROM
DBA_HIST_ACTIVE_SESS_HISTORY ASH,
DBA_HIST_SQLTEXT S,
DBA_OBJECTS O
WHERE
ASH.SQL_ID = S.SQL_ID (+) AND
ASH.CURRENT_OBJ# = O.OBJECT_ID (+) AND
ASH.SAMPLE_TIME BETWEEN
TO_TIMESTAMP('09.05.2007 15:30:00', 'dd.mm.yyyy hh24:mi:ss') AND
TO_TIMESTAMP('09.05.2007 16:30:00', 'dd.mm.yyyy hh24:mi:ss')  
group by  s.sql_id , ash.session_id , ash.sample_time , ash.blocking_session ,  o.object_name , ash.pga_allocated 
ORDER BY sum_pga_mb  DESC , ash.session_id 
fetch first 100 rows only ;




Option 4:


BREAK ON snap_begin SKIP 1 ON snap_end ON event_name

COL event_name FOR A40

SELECT
    CAST(begin_interval_time AS DATE) snap_begin
  , TO_CHAR(CAST(end_interval_time AS DATE), 'HH24:MI') snap_end
  , category
  , num_processes
  , ROUND(allocated_max/1048576)     max_mb
  , ROUND(max_allocated_max/1048576) max_max_mb
FROM
    dba_hist_snapshot
  NATURAL JOIN
    dba_hist_process_mem_summary
WHERE
    begin_interval_time > SYSDATE - 3
--AND category = 'SQL'
ORDER BY
    snap_begin
  , category
/


Option 5: 

SET LINESIZE 150
SET PAGESIZE 100

COLUMN snap_time FORMAT A20
COLUMN total_pga_allocated_mb FORMAT 999,999.99
COLUMN total_pga_used_mb FORMAT 999,999.99

SELECT TO_CHAR(s.end_interval_time, 'YYYY-MM-DD HH24:MI:SS') AS snap_time,
       ROUND((p.value + px.value) / 1024 / 1024, 2) AS total_pga_allocated_mb,
       ROUND((p.value - p_old.value + px.value - px_old.value) / 1024 / 1024, 2) AS total_pga_used_mb
  FROM DBA_HIST_SNAPSHOT s,
       DBA_HIST_PGASTAT p,
       DBA_HIST_PGASTAT p_old,
       DBA_HIST_PGASTAT px,
       DBA_HIST_PGASTAT px_old
 WHERE s.snap_id = p.snap_id
   AND s.snap_id = p_old.snap_id(+)
   AND s.snap_id = px.snap_id
   AND s.snap_id = px_old.snap_id(+)
   AND p.name = 'total PGA allocated'
   AND p_old.name(+) = 'total PGA allocated'
   AND px.name = 'total PGA used for auto workareas'
   AND px_old.name(+) = 'total PGA used for auto workareas'
   AND s.instance_number = p.instance_number
   AND s.instance_number = p_old.instance_number(+)
   AND s.instance_number = px.instance_number
   AND s.instance_number = px_old.instance_number(+)
 ORDER BY s.snap_id;




Current Usage :


set line 200
col name format a70
col value format 999,999,999,999
select name , value/1024/1024 "size_in_mb" , unit  from v$pgastat ;

col username format a20
col program format a20
SELECT s.sid,
       s.serial#,
       s.username,
       s.program,
       n.name,
       p2.pga_alloc_mem / 1024 / 1024 AS allocated_mb,
       p2.pga_used_mem / 1024 / 1024 AS used_mb
  FROM v$session s  , v$process p2 ,v$sesstat p ,   v$statname n
    where   s.paddr = p2.addr 
      and s.sid = p.sid 
     and p.statistic# = n.statistic# 
and  n.name = 'session pga memory'
   AND s.username IS NOT NULL
 ORDER BY allocated_mb DESC;


Comments

Popular posts from this blog

How To Purge Optimizer Statistics Advisor Old Records From 12.2 Onwards (Doc ID 2660128.1)

Oracle session snapper

Oracle Materialized View In-Depth and Materialized View refresh issues in 19c