This is a simple script that I wrote more than 20 years ago (for 8.1.7.4 apparently) to get the session activity from parallel query slaves as they were running. I’m posting it now because there’s a question on the Oracle Database Forum where it would be useful as a way for checking for a skewed data distribution in a long-running query.
Oracle gives use the view v$px_sesstat which connects PX slaves with their query co-ordinator (QC) and reports the session activity for all of them. The view only report statistics numbersm though, so this little query joins the view to v$statname to report the names. It eliminates stats where the value is zero, and orders by QC (though you could add a line to restrict the query to a single QC), parallel server group, then process, then statistic number.
rem
rem Script: px_stats.sql
rem Author: Jonathan Lewis
rem Dated: Mar 2001
rem Purpose: Report statistics for PX slaves on the fly
rem
rem Last tested
rem 19.3.0.0
rem Notes:
rem Note that the co-ordinator can be on a different instance
rem in parallel server systems. To cater for an oddity of the
rem qcinst report, we need the current instance number in case
rem the QC is on the current machine.
rem
rem If the co-ordinator is present, then it appears last on the list
rem for a server group.
rem
rem This code really needs to be enhanced to do a proper job on OPS/RAC
rem by accessing gv$px_sesstat, and handling sids and instances correctly
rem
rem The user running this query has to have SELECT privileges
rem on the views v$instance, v$statname and v$px_sesstat
rem
column instance_number new_value m_inst
select instance_number from v$instance;
spool px_stats
set tab off
set pagesize 60
set linesize 156
set trimspool on
set verify off
break -
on qcsid skip 1 -
on server_group -
on degree -
on server_set -
on sid -
on server# skip 1
column qcsid format a6 heading 'Coord'
column server_group format 999 heading 'Grp'
column degree format a5 heading 'Deg'
column server_set format 999 heading 'Set'
column server# format 999 heading 'Sno'
column sid format 9999 heading 'SID'
column name format a52 heading 'Statistic'
column value format 99,999,999,999 heading 'value'
select
st.qcsid || '/' || nvl(st.qcinst_id,&m_inst) qcsid,
st.server_group,
decode(degree,
null,null,
st.degree || '/' || st.req_degree
) degree,
st.server_set,
st.server#,
st.sid,
sn.name,
st.value
from
v$px_sesstat st,
v$statname sn
where
sn.statistic# = st.statistic#
and st.value != 0
order by
st.qcsid,
st.server_group,
st.server_set,
st.server#,
st.statistic#
;
clear columns
clear breaks
set verify on
spool off
See also: Parallel Inactivity for a simple script reporting wait events
[…] also: Parallel Activity for the session activity stats […]
Pingback by Parallel Inactivity | Oracle Scratchpad — April 7, 2022 @ 5:08 pm BST Apr 7,2022 |