關聯表更新Merge優化

2021-09-28 14:21:12 字數 2527 閱讀 8087

昨天,有一位美女提出了如下需求,週末沒事,在家裡好好查了一下。

1 需求分析

有三張表,商品表(tblitem),庫存表(tblstorage),庫存管理表(tblmanagement);

每一種商品對應的處理區分是0,並且庫存總量大於1000,就把庫存管理表的庫存區分更新為1,小於1000,更新為0。

2 資料準備

drop table tblitem;

drop table tblstorage;

drop table tblmanagement;

create table tblitem as  select d.owner as itemno,round(dbms_random.value) as handle_*** from dba_objects d where d.owner<>'sys';

create table tblstorage as select d.owner as itemno,trunc(dbms_random.value(0,100)) as stror_amount from dba_objects d where d.owner<>'sys' ;

create table tblmanagement as select d.owner as itemno,round(dbms_random.value) as store_kind from dba_objects d where d.owner<>'sys' ;

3 sql改善

3.1 寫法一

這種寫法能夠實現需求,但是作為資深的老牌強迫症患者,一條sql語句中重複掃瞄一張表是不能忍受的,所以有了下面異想天開的寫法。

3.2寫法二(錯誤)

with tmp as

(select s.itemno, (case when sum(s.stror_amount)>1000 then 1

else 0 end) as amout***

from tblitem i

inner join tblstorage s

on i.itemno=s.itemno

where i.handle_***=0

group by s.itemno)

update tblmanagement m

set m.store_kind=(select t.amout***

from tmp t

where t.itemno=m.itemno)

where exists(select 1

from tmp t

where t.itemno=m.itemno);

這條語句直接有語法錯誤,如果是檢索處理,用with提取公共部分,還可以,但是是更新操作,無法實現。

3.3 merge優化

用merge改寫,避免了表的重複的掃瞄,物理讀有181k降低到75多。io減少一半。

oracle關聯表更新

如果有a表和b表,sql server中用 update a set field2 b.filed2 from a,b where a.field1 b.field1搞定,所以用慣了sql server的更新表語句,再用oracle的那真是特別的拗口。情景一 如果只是更新固定值,oracle和sql...

兩個超大表做關聯更新的優化 之 批量更新

兩個超大表做關聯更新的優化 2010 12 17 13 43 01 分類 oracle 今天同事給了兩個sql,超級大,乙個表8000多萬,乙個表7800萬,原語句如下 more update channel chengdu.o user cons partition p201011 a set u...

Oracle的關聯表更新(二)

oracle資料庫中有乙個表formtable main 159 dt1結構如下 mainid,id 161,100,161,101,161,102,162,103 162,104 163,105 現在增加乙個字段序號,實現如下的效果 mainid,id,xuhao 161,100,1 161,10...