ITPub博客

首页 > 数据库 > Oracle > oracle hint /*+ BYPASS_UJVC*/ 使用案例

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

原创 Oracle 作者:hurp_oracle 时间:2014-12-02 23:00:22 0 删除 编辑
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博客 ” ,链接:https://blog.itpub.net/29446986/viewspace-1354557/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2014-01-17

  • 博文量
    152
  • 访问量
    647372