Postgresql

DELETE 加 INSERT,還是 UPSERT 行?

  • August 7, 2022

我試圖找出最快的方法:

  • 如果不存在則插入一行
  • 替換(一次所有列)該行(如果存在)

我考慮過DELETE+ INSERT,但這看起來像 2 次掃描,如果我執行INSERT+ ON CONFLICT,我會得到一個巨大的查詢,其中所有內容都必須複製。

有沒有公認的方法來做到這一點?

這是UPSERT ( )的一個公認案例。INSERT ... ON CONFLICT .. DO UPDATE ...

而簡單的情況只涉及一次索引掃描。(除了可能的鎖定和寫入以及索引更新。)

一方面,並發寫入負載下的競爭條件通常會更智能地處理。看:

而且它通常也更便宜。*“如果存在則替換(一次所有列)該行”*聽起來有點可疑。如果“該行存在”,則至少一列或多列必須相同。另一方面,UPDATE在任何情況下都寫入一個新的行版本(如果它完全寫入)。如果可以結轉烘烤欄位或使用 HOT 索引條目,那仍然比DELETE+便宜。看:INSERT``UPDATE

您的*“必須複製所有內容的巨大查詢”*表明存在優化的潛力或可能的誤解。如果可能是這種情況,請顯示您的查詢以及您的 Postgres 版本、可重現的設置和所需的結果(在一個新問題中!)。

也就是說,如果您沒有烤列,沒有繁重的並發寫入負載,並且索引很少(或只有一個),那麼DELETE+INSERT只會稍微貴一些。

在沒有並發寫入負載的情況下替換錶的大部分內容時,它甚至可能更便宜。您可能會在和VACUUM之間的表格…但這與問題中的案例相去甚遠。DELETE``INSERT

引用自:https://dba.stackexchange.com/questions/315310