Postgresql
DELETE 加 INSERT,還是 UPSERT 行?
我試圖找出最快的方法:
- 如果不存在則插入一行
- 替換(一次所有列)該行(如果存在)
我考慮過
DELETE
+INSERT
,但這看起來像 2 次掃描,如果我執行INSERT
+ON CONFLICT
,我會得到一個巨大的查詢,其中所有內容都必須複製。有沒有公認的方法來做到這一點?
這是UPSERT ( )的一個公認案例。
INSERT ... ON CONFLICT .. DO UPDATE ...
而簡單的情況只涉及一次索引掃描。(除了可能的鎖定和寫入以及索引更新。)
一方面,並發寫入負載下的競爭條件通常會更智能地處理。看:
而且它通常也更便宜。*“如果存在則替換(一次所有列)該行”*聽起來有點可疑。如果“該行存在”,則至少一列或多列必須相同。另一方面,
UPDATE
在任何情況下都寫入一個新的行版本(如果它完全寫入)。如果可以結轉烘烤欄位或使用 HOT 索引條目,那仍然比DELETE
+便宜。看:INSERT``UPDATE
您的*“必須複製所有內容的巨大查詢”*表明存在優化的潛力或可能的誤解。如果可能是這種情況,請顯示您的查詢以及您的 Postgres 版本、可重現的設置和所需的結果(在一個新問題中!)。
也就是說,如果您沒有烤列,沒有繁重的並發寫入負載,並且索引很少(或只有一個),那麼
DELETE
+INSERT
只會稍微貴一些。在沒有並發寫入負載的情況下替換錶的大部分內容時,它甚至可能更便宜。您可能會在和
VACUUM
之間的表格…但這與問題中的案例相去甚遠。DELETE``INSERT