oracle hint /*+ BYPASS_UJVC*/ 使用案例

hurp_oracle發表於2014-12-02
var B2 number;
exec :B2:=530;
var B1 number;
exec :B1:=201411;
UPDATE  PRERPT.STATQ_WRTOFF_PLYD_PRE P SET GFLAG = 1 WHERE EXISTS (SELECT 1 FROM PRERPT.STATB_GROUP_ACCOUNT T WHERE T.REGION = :B2 AND T.CYCLE = :B1
AND T.ACCTID = P.ACCTID )

該語句由於沒有選擇正確的執行計劃,導致語句非常慢
Plan hash value: 4033170240
---------------------------------------------------------------------------------------------------
| Id   | Operation                 | Name                  | Rows | Bytes | Cost | Pstart | Pstop |
---------------------------------------------------------------------------------------------------
|    0 | UPDATE STATEMENT          |                       |      |       |   23 |        |       |
|    1 |  UPDATE                   |                       |      |       |      |        |       |
| *  2 |   HASH JOIN SEMI          |                       |    2 |   130 |   23 |        |       |
|    3 |    PARTITION RANGE ALL    |                       |      |       |      |      1 | 17    |
|    4 |     TABLE ACCESS FULL     | STATQ_WRTOFF_PLYD_PRE | 1394 | 36244 |    3 |      1 | 17    |   =======〉該表大應該是被驅動表,在這裡反而是驅動表。
|    5 |    PARTITION RANGE SINGLE |                       |      |       |      |    KEY | KEY   |
| *  6 |     TABLE ACCESS FULL     | STATB_GROUP_ACCOUNT   |    1 |    39 |   19 |    KEY | KEY   |    ========〉該結果集返回的行資料少,應該是驅動表但這裡是被驅動表。
---------------------------------------------------------------------------------------------------


Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("ACCTID"="ACCTID")
6 - filter("REGION"=:B2 AND "CYCLE"=:B1)


透過對上述語句進行改寫,直接update一檢視來完成驅動表和被驅動表的轉變。由於UPDATE檢視要求T具有唯一索引,所在必須要加上Hint /*+ BYPASS_UJVC*/ 來避免唯一性檢查。
UPDATE (SELECT /*+ BYPASS_UJVC use_hash(p,t) leading(t) */
         p.gflag
          FROM prerpt.statq_wrtoff_plyd_pre p
         INNER JOIN (SELECT DISTINCT acctid
                      FROM prerpt.statb_group_account t
                     WHERE t.region = :b2
                       AND t.cycle = :b1) t
            ON t.acctid = p.acctid)
   SET gflag = 1      

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

相關文章