I've posted a couple of examples (here and here) of Parallel Execution servers for Parallel Query.
How do we identify usage of Parallel Execution ?
I will update this post (and, possibly, subsequent post(s)) with a few methods.
The first one (as I've shown in my previous posts) is to look at the column PX_SERVERS_EXECUTIONS in either V$SQLSTATS or V$SQL. This can identify the number of PX Servers used for an SQL (Query or DML). However, there is a caveat when the SQL undergoes multiple execution -- the statistic on PX_SERVERS_EXECUTIONS may be cumulative (i.e. additive) across all the executions of the SQL. Stay tuned for that information.
Another method is to look at the V$PX_PROCESS and V$PX_SESSION views.
Let me demonstrate this second method using the same SQL query from my previous blog post.
The query by the SYS user is from a different session while the "select /*+ PARALLEL */ count(*) from Large_Table;" is being executed by HEMANT. This query is on V$PX_SESSION and shows only when the Parallel Query sessions are active -- i.e. running HEMANT's parallel count(*) query. (If I query V$PX_SESSION after the parallel count(*) completes, I won't get the information).
The above output demonstrates
(a) that there were no PX servers before I began the parallel count(*) query and there were 16 at the end -- 16 PX servers had been started and had not yet shutdown by the time I queried V$PX_PROCESS (They will shutdown after a while ** note below).
(b) that my parallel count(*) query (executed by SID 197 which is the QueryCo-ordinator -- represented by QCSID) DID request and use 16 PX server sessions (as evidenced in the output from the query on V$PX_SESSION). Thus, what I claimed on the basis of PX_SERVERS_EXECUTION in my previous post is correct.
** Note : A few minutes later, I can see that the PX Servers have shutdown.
Later, I will demonstrate how to join V$PX_PROCESS and V$PX_SESSION.
I will also demonstrate how you manage the number of PX Servers.
.
.
.
How do we identify usage of Parallel Execution ?
I will update this post (and, possibly, subsequent post(s)) with a few methods.
The first one (as I've shown in my previous posts) is to look at the column PX_SERVERS_EXECUTIONS in either V$SQLSTATS or V$SQL. This can identify the number of PX Servers used for an SQL (Query or DML). However, there is a caveat when the SQL undergoes multiple execution -- the statistic on PX_SERVERS_EXECUTIONS may be cumulative (i.e. additive) across all the executions of the SQL. Stay tuned for that information.
Another method is to look at the V$PX_PROCESS and V$PX_SESSION views.
Let me demonstrate this second method using the same SQL query from my previous blog post.
[oracle@localhost ~]$ sqlplus hemant/hemant
SQL*Plus: Release 11.2.0.2.0 Production on Tue Mar 3 23:34:37 2015
Copyright (c) 1982, 2010, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
HEMANT>select distinct sid from v$mystat;
SID
----------
197
HEMANT>select count(*) from v$px_process;
COUNT(*)
----------
0
HEMANT>select count(*) from v$px_session;
COUNT(*)
----------
0
HEMANT>select degree from user_tables where table_name = 'LARGE_TABLE';
DEGREE
----------------------------------------
1
HEMANT>show parameter cpu
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
cpu_count integer 4
parallel_threads_per_cpu integer 4
resource_manager_cpu_allocation integer 4
HEMANT>set serveroutput off
HEMANT>select /*+ PARALLEL */ count(*) from Large_Table;
COUNT(*)
----------
4802944
HEMANT>select count(*) from v$px_process;
COUNT(*)
----------
16
SYS>select qcsid, req_degree, degree, count(*)
2 from v$px_session
3 group by qcsid, req_degree, degree
4 /
QCSID REQ_DEGREE DEGREE COUNT(*)
---------- ---------- ---------- ----------
197 1
197 16 16 16
SYS>
The query by the SYS user is from a different session while the "select /*+ PARALLEL */ count(*) from Large_Table;" is being executed by HEMANT. This query is on V$PX_SESSION and shows only when the Parallel Query sessions are active -- i.e. running HEMANT's parallel count(*) query. (If I query V$PX_SESSION after the parallel count(*) completes, I won't get the information).
The above output demonstrates
(a) that there were no PX servers before I began the parallel count(*) query and there were 16 at the end -- 16 PX servers had been started and had not yet shutdown by the time I queried V$PX_PROCESS (They will shutdown after a while ** note below).
(b) that my parallel count(*) query (executed by SID 197 which is the QueryCo-ordinator -- represented by QCSID) DID request and use 16 PX server sessions (as evidenced in the output from the query on V$PX_SESSION). Thus, what I claimed on the basis of PX_SERVERS_EXECUTION in my previous post is correct.
** Note : A few minutes later, I can see that the PX Servers have shutdown.
HEMANT>select count(*) from v$px_process
2 /
COUNT(*)
----------
0
HEMANT>
Later, I will demonstrate how to join V$PX_PROCESS and V$PX_SESSION.
I will also demonstrate how you manage the number of PX Servers.
.
.
.