iT邦幫忙

0

postgresql 對 partition table 操作問題

  • 分享至 

  • xImage

前輩們好,

狀況是這樣的,目前有兩個 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 解決。

不曉得前輩還有沒有其他建議解法可以提供的?
如果有不清楚的地方請留言告知,我再修正內文。

先在此感恩~ <(_ __)>

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

0
fuzzylee1688
iT邦研究生 3 級 ‧ 2021-12-17 16:26:06

可先針對 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;

我要發表回答

立即登入回答