Oracle如何查询会话并行度

Oracle如何查询会话并行度

需要定位到会话的SID值。

自己发起的会话可在一开始使用如下语句查询。

select userenv('sid') from dual;

并行度可通过如下SQL查询:

SELECT * from gv$px_session pxs where  pxs.qcsid||pxs.qcserial#=(SELECT sid||serial# FROM gv$session WHERE sid=289 and inst_id=1);

其中,DEGREE字段为实际使用的并行度。

关于gv$px_session字段的说明如下:

字段名 数据类型 描述
SADDR RAW(4 | 8) 会话地址
SID NUMBER 会话标识符
SERIAL# NUMBER 会话序列号
QCSID NUMBER 并行协调器的会话标识符
QCSERIAL# NUMBER 并行协调器的会话序号
QCINST_ID NUMBER 运行并行协调器的实例号
SERVER_GROUP NUMBER 此集群数据库进程所属的服务器逻辑组
SERVER_SET NUMBER 此集群数据库进程所属的逻辑服务器集。一个服务器组最多有两个服务器组。
SERVER# NUMBER 服务器集中集群数据库进程的逻辑号
DEGREE NUMBER 服务器集使用的并行度
REQ_DEGREE NUMBER 用户在发出语句时以及在任何资源、多用户或负载平衡减少之前请求的并行度

补充点1

类似SQL:select /*+ parallel(4) */ from table_name;执行后,查询GV$PX_SESSION.REQ_DEGREE会等于你指定的并行度4,但是实际的GV$PX_SESSION.DEGREE的值会等于min(parallel_max_servers,4)。

举个例子,

如果parallel_max_servers=8,指定并行度为 /*+ parallel(4) */,那么GV$PX_SESSION.DEGREE=4

如果parallel_max_servers=2,指定并行度为 /*+ parallel(4) */,那么GV$PX_SESSION.DEGREE=2

补充点2

并行产生的子会话数=2*GV$PX_SESSION.DEGREE。

举个例子(假设sid=289),

如果parallel_max_servers=32,指定并行度为 /*+ parallel(4) */,那么GV$PX_SESSION.DEGREE=4。此时下边count(*)=8:

SELECT count(*) from gv$px_session pxs where  pxs.qcsid||pxs.qcserial#=(SELECT sid||serial# FROM gv$session WHERE sid=289 and inst_id=1) and sid!=289;

如果parallel_max_servers=2,指定并行度为 /*+ parallel(4) */,那么GV$PX_SESSION.DEGREE=2。此时下边count(*)=4:

SELECT count(*) from gv$px_session pxs where  pxs.qcsid||pxs.qcserial#=(SELECT sid||serial# FROM gv$session WHERE sid=289 and inst_id=1) and sid!=289;

尚不清楚是否严格正确。

补充点3

会话级别开启并行,不通过hint,不通过表/索引设置并行度。

用这个语句发现不生效:alter session enable parallel query;

用这个语句生效:alter session force parallel query;   或者  alter session force parallel query parallel 4;

不生效的原因尚不清楚。

补充点4

使用默认的parallel_max_servers,可能导致Utlrp.Sql脚本运行特别慢并且有可能导致进程数量爆满。

详见Utlrp.Sql Is Taking Too Long To Complete. (文档 ID 564605.1)、Where Can I Find the Parallel Version of Utlrp.sql? (文档 ID 230136.1)

原文地址:https://www.cnblogs.com/PiscesCanon/p/15573520.html