oracle频繁update同一张表,对于同一张表update带来的效率问题

需求:

存在一张表

create table tmp_report

(

...

tmp_domain varchar(20),

report_status int

...

);

其中2列的值为:

tmp_domain report_status

a3

a2

a1

b4

希望update report_status 的值为3所对应 tmp_domain 值相同的 report_status 都改成3,即:

tmp_domain report_status

a3

a3

a3

b4

开始用以下sql报错:

update tmp_report a set a.report_status = 3 where a.tmp_domain in

(select b.tmp_domain from tmp_report b where b.report_status =3);

-- ERROR 1093 (HY000): You can't specify target table 'a' for update in FROM clause

更新:

update 前先备份tmp_report表

方法一:

root@localhost db1> update tmp_report a,tmp_report b set a.report_status = 3

->  where a.tmp_domain=b.tmp_domain and b.report_status=3;

Query OK, 2048 rows affected (11.32 sec)

Rows matched: 3072  Changed: 2048  Warnings: 0

-- 慢查询中的记录,扫描的行数大概是笛卡尔积

# Query_time: 11.318816  Lock_time: 0.000205 Rows_sent: 0  Rows_examined: 3146752

SET timestamp=1348214131;

update tmp_report a,tmp_report b set a.report_status = 3

where a.tmp_domain=b.tmp_domain and b.report_status=3;

恢复备份表:

root@localhost db1>delete from tmp_report;

Query OK, 3072 rows affected (0.09 sec)

root@localhost db1>insert into tmp_report select * from tmp_reportbak;

Query OK, 3072 rows affected (0.12 sec)

Records: 3072  Duplicates: 0  Warnings: 0

方法二:

root@localhost db1> update tmp_report set report_status = 3 where tmp_domain in (select tmp_domain from (select tmp_domain from tmp_report where report_status =3) tmp);

Query OK, 2048 rows affected (0.15 sec)

Rows matched: 3072  Changed: 2048  Warnings: 0

对于大表的时候,这两种方法都很慢。分开语句会好很多~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值