שליפות שעושות Downgrade

לפעמים יש צורך למצוא מהן השליפות שעשו downgrade במערכת ולא קיבלו מספיק parallel processes. צריך להבחין בין שני מקרים: מקרה שהשליפות קיבלו חלק מהמשאבים ומקרה שבהם הן לא קיבלו בכלל משאבים ועכשיו הן עובדות ב-serial.

כדי למצוא מהן השליפות שקיבלו downgrade (אבל עדיין עובדות ב-Parallel) ניתן להשתמש בשליפה הבאה. השליפה מחזירה רק את ה-PX coordinator (כלומר ה-SID של ההורה) ולא את כל הפרוססים עצמם:

SELECT a.sid parent_sid,
       a.logon_time,
       a.program,
       a.osuser,
       a.username,
       a.sql_id,
       ps.req_degree,
       ps.got_degree
  FROM (SELECT s.sid,
               s.osuser,
               s.USERNAME,
               s.status,
               s.sql_id,
               s.logon_time,
               s.last_call_et,
               UPPER(s.program) program
          FROM v$session s
         WHERE ((s.username IS NOT NULL) AND (NVL(s.osuser, 'x') <> 'SYSTEM') AND
               (s.TYPE <> 'BACKGROUND'))) a
  JOIN (SELECT DISTINCT qcsid,
                        CASE
                            WHEN req_degree > degree THEN
                             1
                            ELSE
                             0
                        END is_downgrade,
                        MAX(req_degree) req_degree,
                        MAX(degree) got_degree
          FROM v$px_session
         GROUP BY qcsid,
                  CASE
                      WHEN req_degree > degree THEN
                       1
                      ELSE
                       0
                  END) ps ON a.sid = ps.qcsid
 WHERE ps.is_downgrade = 1

כדי לאתר את השליפות שלא קיבלו פרוססים בכלל (ובעצם עשו downgrade to serial) ניתן להשתמש בשליפה הבאה:

SELECT sess.sid parent_sid,
		 logon_time,
		 sess.program,
		 sess.osuser,
		 sess.username,
		 sql_id,
		 TRUNC (last_call_et / 60) dur_minutes
  FROM v$sesstat sesstat, v$sysstat sysstat, v$session sess
 WHERE	  sesstat.statistic# = sysstat.statistic#
		 AND sesstat.sid = sess.sid
		 AND name = 'Parallel operations downgraded to serial'
		 AND sesstat.VALUE > 0
		 AND sess.status = 'ACTIVE'

n השליפות הארוכות ביותר של משתמש מתוך ה-AWR

איך מוציאים את 30‏ השליפות הארוכות ביותר של משתמש מסויים מתוך ה-AWR‏?

משתמשים בשליפה הבאה:

select sub.sql_id,
       txt.sql_text,
       parsing_schema_name,
       sub.seconds_since_date,
       sub.execs_since_date,
--       sub.gets_since_date,
       round(sub.seconds_since_date / sub.execs_since_date, 3) avg_query_time
  from ( -- sub to sort before rownum
        select sql_id,
                g.parsing_schema_name,
                round(sum(elapsed_time_delta) / 1000000) as seconds_since_date,
                sum(executions_delta) as execs_since_date,
                sum(buffer_gets_delta) as gets_since_date
          from dba_hist_snapshot natural
          join dba_hist_sqlstat g
         where begin_interval_time > to_date('2010-01-01', 'YYYY-MM-DD')
           and parsing_schema_name = '&user_name'
         group by sql_id, g.parsing_schema_name
         order by seconds_since_date desc) sub
  join dba_hist_sqltext txt on sub.sql_id = txt.sql_id
 where rownum < &n;

אז מה קורה עם השליפה הזו?!?

כדי לדעת מה הסטטוס של שליפה שרצה ב-Parallel, כותבת ל-Temp ובכלל עושה המון שלבים, אפשר להשתמש בשליפה הזו:

SELECT TO_NUMBER(DECODE(sid, 65535, NULL, sid)) || '(' || qcsid || ')' sid,
       gv$sql_workarea_active.sql_id,
       operation_type || '(' || operation_id || ')' operation,
       TRUNC(work_area_size / 1024 / 1024) wsize,
       TRUNC(expected_size / 1024 / 1024) esize,
       TRUNC(actual_mem_used / 1024 / 1024) "MEM_USE(MB)",
       TRUNC(max_mem_used / 1024 / 1024) "MAX MEM(MB)",
       number_passes passes,
       active_time / 1000000 / 60 active_time,
       tempseg_size / 1024 / 1024 tempseg_size,
       ROWS_PROCESSED,
       tablespace tbs
  FROM gv$sql_workarea_active
  join gv$sqlarea
    on gv$sql_workarea_active.sql_id = gv$sqlarea.sql_id
 where gv$sql_workarea_active.sql_id like '1b66186na1r25%'
 ORDER BY tempseg_size desc nulls last

השליפה מקבלת SQL_ID וצריך לשים לב שאם יש יותר משליפה כזו בזמן מסויים, היא תחזיר את הסטטוס של כל השליפות מאותו ID שרצות באותו זמן.