簡體   English   中英

如何更新 jsonb 類型值的大型(100 萬行以上)postgres 列

[英]How to update a large (1 million+ rows) postgres column of jsonb type values

嘗試在名為 params 的列中更新 jsonb 類型內的特定數組,並且在花費多長時間時遇到問題。 例如,有一個表,其中一行包含一個數組所有者

{
  "hidden": false,
  "org_id": "34692",
  "owners": [
    "tim@facebuk.com"
  ],
  "deleted": false
}

另一個例子

{
  "hidden": false,
  "org_id": "34692",
  "owners": [
    "tim@google.com"
  ],
  "deleted": false
}

而且基本上有一百萬行(所有這些行都具有不同的 email 域作為owner 。我有這個查詢,我想在所有這些行中執行:

UPDATE table set params = CASE WHEN params->>'owners' NOT LIKE '%google.com%' THEN jsonb_set(params, '{owners}', concat('"', substr(md5(random()::text), 0, 25), '@googlefake.com"')::jsonb) ELSE params END

我已經使用 100 個數據集進行了測試,它的執行時間很完美,但是使用 1000 倍的倍數執行此操作會使查詢永遠執行,而且我不知道它是否真的會成功完成。 不完全確定如何加快此過程或以更好的方式利用它。 我確實嘗試過索引,例如 CREATE INDEX ON table((params->>'owners')); 無濟於事。 查詢已運行 >1 小時,並且有多行與此類似。

我索引不正確嗎? 另外,我研究了 gin 運算符,@> 無濟於事,因為每個所有者字段都不同

使用過濾掉不需要修改的行的WHERE子句避免不必要的更新。 也許用索引來支持這種情況會有所幫助。

更新完成后,您可能希望運行VACUUM (FULL)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM