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/
,如需转载,请注明出处,否则将追究法律责任。