我想更新多行。我有很多指定要更新哪一行的id(大約12k個id)。更新許多特定行上的相同數據
什麼是最好的方法來實現這一目標?
我知道我可以做
UPDATE table SET col="value" WHERE id = 1 OR id = 24 OR id = 27 OR id = ....repeatx10000
但我想,這將使糟糕的表現,對不對?那麼是否有更好的方式來指定更新哪些ID?
Postgresql版本是9.1
我想更新多行。我有很多指定要更新哪一行的id(大約12k個id)。更新許多特定行上的相同數據
什麼是最好的方法來實現這一目標?
我知道我可以做
UPDATE table SET col="value" WHERE id = 1 OR id = 24 OR id = 27 OR id = ....repeatx10000
但我想,這將使糟糕的表現,對不對?那麼是否有更好的方式來指定更新哪些ID?
Postgresql版本是9.1
在嚴格的更新性能方面沒有太大的改變。所有具有給定ID的行都必須找到並更新。
有一件事情可能會簡化你的電話,使用in
關鍵字。它是這樣的:
UPDATE table SET col="value" WHERE id in (1,24,27, ...);
我還建議確保該ID是在同一順序喜歡上了ID的指數顯示,很可能上升。
將你的ID放在一個表中。然後做這樣的事情:
UPDATE table SET col="value" WHERE id in (select id from table_of_ids_to_update)
或者,如果你的IDS的來源是一些其他的查詢,使用查詢獲取要更新的ID。
UPDATE table SET col="value" WHERE id in (
select distinct id from some_other_table
where some_condition_for_updating is true
... etc. ...
)
對於更復雜的基於另一個表進行更新的情況,this question給出了一個很好的例子。
UPDATE table SET col =「value」WHERE id in(select id from table);
也使您的id字段索引,你會得到更好的表現。
值得一提的是,如果你做參考表作爲@ dan1111建議,不要使用in (select ..)
,當然避免distinct
!相反,使用exists
-
update table
set col = value
where exists (
select from other_table
where other_table.id = table.id
)
這確保了參考表只掃描一樣,因爲它是必要的。
默認情況下,主鍵被索引。 – Dariusz 2013-02-28 10:58:37
如果它是主鍵那麼它沒關係 – 2013-02-28 12:24:31