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)