Postgresql

更新具有數千萬條記錄的表時性能下降

  • December 3, 2012

我想更新表(我是 20-30 ),每個表都有數百萬條記錄。

問題是更新過程花費了太多時間,而且當時 CPU 使用率也很高。我想這樣做,在處理數據時它不能使用太多 CPU。如果處理時間增加,那麼這對我來說不是問題,但它應該使用有限的 CPU 資源來處理(更新)表。我使用 PostgreSQL 作為數據庫,伺服器作業系統是 Linux。

我的範例查詢可以是這樣的

UPDATE TEMP 
SET CUSTOMERNAME = 
 ( select customername from user where user.customerid = temp.customerid );

第一個問題是:為什麼不使用大量 CPU 時間很重要?查詢將在某些資源上遇到瓶頸;如果您可以引入足夠多的額外磁碟訪問,那麼每秒使用的 CPU 時間就會下降,但這真的是一種改進嗎?您希望飽和什麼資源?了解您為何強調這一點可能有助於指導人們提供您認為有用的答案。

正如評論中所建議的那樣,您的查詢可能會通過連接而不是相關子查詢執行得更快。像這樣的東西:

UPDATE temp
 SET customername = user.customername
 FROM user
 WHERE user.customerid = temp.customerid;

要知道的另一件重要事情是您是否要更新表中的所有行。某些值是否已經正確?如果是這樣,您將通過不更新不需要它的行來獲得很大的性能提升。添加AND temp.customername is distinct from user.customernameWHERE子句中。

如果您限制每條語句中更新的行數,並且VACUUM ANALYZE在每次 UPDATE 之後,您將避免表膨脹。如果希望最小化 CPU 時間的目的是避免對並發事務的性能影響,那麼這將使您有機會在開始一組中sleep的下一個之前引入一個短暫的延遲(以 a 或類似的形式)UPDATE行。

更好的是,為什麼您將資訊冗餘地儲存在臨時表中,而不是在需要時加入它?(有時有充分的理由;但通常沒有。)

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