delete 的优化

drop table a;
drop table b;
create table a(city varchar2(20),tel_num number,plags number);
insert into a values('济南','13791135771','1');
insert into a values('聊城','13791135771','1');
insert into a values('青岛','13891136721','2');
commit;
create table b(city varchar2(20),tel_num number);
insert into b values('济南','1379113');
insert into b values('聊城','1310012');
insert into b values('青岛','1389113');
commit;
CITY                    TEL_NUM      PLAGS
-------------------- ---------- ----------
济南                 1379113577          1
聊城                 1379113577          1
青岛                 1389113672          2
SQL> select * from b;
CITY                    TEL_NUM
-------------------- ----------
济南                    1379113
聊城                    1310012
青岛                    1389113
delete from a
 where rowid in (select a.rowid
                   from a
                  inner join b
                     on (b.tel_num = substr(a.tel_num, 1, 7))
                    and a.city <> b.city);


commit;

SQL> select * from a;
CITY                    TEL_NUM      PLAGS
-------------------- ---------- ----------
济南                 1379113577          1
青岛                 1389113672          2
也可以进一步优化(删除少量数据时):
delete /*+ qb_name(outer) leading(b@inner) use_nl(a@outer) */
from a
 where rowid in (select /*+ qb_name(inner) */
                  a.rowid
                   from a
                  inner join b
                     on (b.tel_num = substr(a.tel_num, 1, 7))
                    and a.city <> b.city);

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 73255138
--------------------------------------------------------------------------------
| Id  | Operation                    | Name     | Rows  | Bytes | Cost (%CPU)| T
--------------------------------------------------------------------------------
|   0 | DELETE STATEMENT             |          |     1 |    24 |     9  (23)| 0
|   1 |  DELETE                      | A        |       |       |            |
|   2 |   NESTED LOOPS               |          |     1 |    24 |     9  (23)| 0
|   3 |    VIEW                      | VW_NSO_1 |     2 |    24 |     7  (15)| 0
|   4 |     SORT UNIQUE              |          |     1 |   124 |            |
|*  5 |      HASH JOIN               |          |     2 |   124 |     7  (15)| 0
|   6 |       TABLE ACCESS FULL      | A        |     3 |   111 |     3   (0)| 0
|   7 |       TABLE ACCESS FULL      | B        |     3 |    75 |     3   (0)| 0
|   8 |    TABLE ACCESS BY USER ROWID| A        |     1 |    12 |     1   (0)| 0
--------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   5 - access("B"."TEL_NUM"=TO_NUMBER(SUBSTR(TO_CHAR("A"."TEL_NUM"),1,7)))
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
       filter("A"."CITY"<>"B"."CITY")
Note
-----
   - dynamic sampling used for this statement (level=2)

(TABLE ACCESS BY USER ROWID)USER ROWID 指的是 ROWID 是用户来提供的,INDEX ROWID 是 索引来提供的rowid
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值