我是靠谱客的博主 机灵紫菜,最近开发中收集的这篇文章主要介绍两种关联update的性能对比,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

a表只有126条记录,b表有140万记录
1.


/*card_no必须是主键*/
Update ( Select (Case a.status When '挂失' Then '004' When '卡找回' Then '000'
When '取消用卡资格' Then '008' When '已还款' Then '000' End) status_new,
b.card_status,
(Case When a.status='取消用卡资格' Then 1 Else 0 End) increment_times,
b.suspend_times
From etl_daily_cardstatus a,etl_custcard b
Where a.card_no=b.card_no)
Set card_status=status_new,suspend_times=nvl(suspend_times,0)+increment_times;

这样写竟然需要3秒多才能update完,a.card_no,b.card_no必须是主键,不然会报错:ora-01779:cannot modify a colum which maps to non key-preserved table

2.

Update etl_custcard b
Set (b.card_status,b.suspend_times)=
(
Select (Case a.status When '挂失' Then '004' When '卡找回' Then '000'
When '取消用卡资格' Then '008' When '已还款' Then '000' End) status_new,
(Case When a.status='取消用卡资格' Then 1 Else 0 End) increment_times
From
(Select * From (Select card_no,status,
dense_rank() over (partition by card_no order by seqno desc) seq From etl_daily_cardstatus )
Where seq=1 ) a Where a.card_no=b.card_no )
Where card_no In (Select a.card_no From etl_daily_cardstatus a)

因为a表card_no不是主键了,所以改成这么写,第一次执行要了0.39秒,后面执行在0.016-0.03秒之间。
第二种写法应该是 in 这个where条件起了很大的作用。

最后

以上就是机灵紫菜为你收集整理的两种关联update的性能对比的全部内容,希望文章能够帮你解决两种关联update的性能对比所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(49)

评论列表共有 0 条评论

立即
投稿
返回
顶部