前輩們好,
狀況是這樣的,目前有兩個 table, 分別為 tableA 跟 tableB 等。
而 tableA 有很多依照日期開的 partition table,
然後 partition 值也對應自身以及 tableB 的 mydate 欄位。
(tableA_202101214, tableA_20211215, tableA_20211216 ...)
現在需要 delete tableA 裡面跟 tableB 相同 key 值的資料,
然後再將資料從 tableB insert 回 tableA。
前人是使用下述大略的語法。
DELETE FROM tableA using tableB
WHERE tableA.myNum = tableB.myNum AND tableA.mydate = tableB.mydate;
AND ( tableB.status = '000' OR tableB.status = '' OR tableB.status is null );
但 dba 告知我們這寫法直接把記憶體吃光了,
雖然我是不太理解為啥會有這個結果啦... 但他們只肯提供這個部分。
也許跟 partition 有關? Not sure.
所以先試試看方案
1, 用 insert into select on conflict,
但仍然是沒用到 partition, 不曉得效能會不會一樣爛。
ref : https://stackoverflow.com/questions/39663280/how-to-do-insert-into-select-and-on-duplicate-update-in-postgresql-9-5
2, 直接把 tableB 抓出來跑回圈,
這樣是可以拿到 partition 直接對 tableA 操作 delete 跟 insert,
但就... 想看看能不能直接用 SQL 解決。
不曉得前輩還有沒有其他建議解法可以提供的?
如果有不清楚的地方請留言告知,我再修正內文。
先在此感恩~ <(_ __)>
可先針對 tableB 做subQuery減量資料源.
DELETE FROM tableA using (
select myNum, mydate
from tableB B
where B.status = '000' OR B.status = '' OR B.status is null
) tableB
WHERE tableA.myNum = tableB.myNum AND tableA.mydate = tableB.mydate;