9i並行執行的限制

westzq1984發表於2009-04-12

SELECT zsxh_dk, pzxh, zspzxh, nsr_key, nsrsbh, nsrmc, nsbm,
       hy_dm, djzclx_dm, nsrzt_dm, nsr_swjg_dm, sssq_q_sk, sssq_z_sk
FROM ft_sb_zsxx


SQL> select decode(a.QCSERIAL#, null, 'PARENT', 'CHILD') stmt_level,
  2       a.SID,
  3       a.SERIAL#,
  4       b.USERNAME,
  5       b.OSUSER,
  6       b.SQL_HASH_VALUE,
  7       b.SQL_ADDRESS,
  8       a.DEGREE,
  9       a.REQ_DEGREE
 10  from v$px_session a, v$session b
 11  where a.SID = b.SID
 12  order by a.QCSID, stmt_level desc;

STMT_L        SID    SERIAL# USERN OSUSER          SQL_HASH_VALUE SQL_ADDRESS          DEGREE REQ_DEGREE
------ ---------- ---------- ----- --------------- -------------- ---------------- ---------- ----------
PARENT         32         43 JCZC  Administrator                0 00
CHILD          26         29 JCZC  Administrator       1545317109 07000000539253F8          4          8
CHILD          25         45 JCZC  Administrator       1545317109 07000000539253F8          4          8
CHILD          34          7 JCZC  Administrator       1545317109 07000000539253F8          4          8
CHILD          36          3 JCZC  Administrator       1545317109 07000000539253F8          4          8

由於可能存在程式碼欄位在程式碼表中不能找到,所以需要替換
SELECT ZSXH_DK,PZXH,ZSPZXH, NSR_KEY,NSRSBH,NSRMC,NSBM,
    nvl((SELECT A.HYML_DM FROM DI_HYML A WHERE A.HYML_DM = B.HY_DM),'ZZZZ') HY_DM,
    DJZCLX_DM,NSRZT_DM,NSR_SWJG_DM,SSSQ_Q_SK,SSSQ_Z_SK
 FROM FT_SB_ZSXX B

SQL> select decode(a.QCSERIAL#, null, 'PARENT', 'CHILD') stmt_level,
  2       a.SID,
  3       a.SERIAL#,
  4       b.USERNAME,
  5       b.OSUSER,
  6       b.SQL_HASH_VALUE,
  7       b.SQL_ADDRESS,
  8       a.DEGREE,
  9       a.REQ_DEGREE
 10  from v$px_session a, v$session b
 11  where a.SID = b.SID
 12  order by a.QCSID, stmt_level desc;

no rows selected

這個時候是無法並行的,加了提示仍然不行
SELECT /*+parallel(B,4)*/ZSXH_DK,PZXH,ZSPZXH, NSR_KEY,NSRSBH,NSRMC,NSBM,
    nvl((SELECT A.HYML_DM FROM DI_HYML A WHERE A.HYML_DM = B.HY_DM),'ZZZZ') HY_DM,
    DJZCLX_DM,NSRZT_DM,NSR_SWJG_DM,SSSQ_Q_SK,SSSQ_Z_SK
 FROM FT_SB_ZSXX B

回來測試了下,發現10g可以並行
SQL> SELECT DEGREE FROM dba_tables WHERE table_name='TEST' AND wner='CTAIS2'
  2  ;

DEGREE
----------
         8
        
alter session set "_px_trace"= "all";

SELECT A.*,
    NVL((SELECT B.SWJG_DM FROM DM_SWJG B WHERE B.SWJG_DM = A.FLAG), 'z') swjg
 FROM TEST A

alter session set "_px_trace"= "none";

在跟蹤檔案中可以看到ORACLE在計算並行度


但是在9i下,TRACE檔案感覺是隻列出了表或者提示的並行屬性,就突然中斷了。
估計是9i不允許這樣的並行執行。

另外,如果是insert ... select 這樣的語句,在9i下設定了
alter session force parallel dml,看起來是並行執行的,但是不過並行salve的子SQL
發現其並行的是INSERT操作,並不是SELECT操作
我們的應用主要是點陣圖索引,怕多個子程式相互造成鎖,索引就打住,沒用這個設定

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8242091/viewspace-588742/,如需轉載,請註明出處,否則將追究法律責任。

相關文章