簡體   English   中英

Postgres row_number() 大約每 24 小時將表大小加倍

[英]Postgres row_number() doubling table size roughly every 24 hours

我有一個包含 ~165,000 行的 Assets 表。 但是,資產構成“集合”,每個集合可能有大約 10,000 個項目,我想為這些項目保存“排名”,以便用戶可以看到給定資產在集合中的排名。

排名可能會發生變化(基於內部分數),因此需要定期更新(每小時幾次)。

這是目前在每個集合的基礎上完成的:

UPDATE assets a
SET rank = a2.seqnum
FROM
  (SELECT a2.*,
          row_number() OVER (
                             ORDER BY elo_rating DESC) AS seqnum
   FROM assets a2
   WHERE a2.collection_id = #{collection_id} ) a2
WHERE a2.id = a.id;

然而,這導致表的大小大約每 24 小時翻一番(即 1GB 到 2GB)。

VACUUM FULL這個問題,但這並不是一個真正的解決方案。

是否可以調整查詢以不創建太多(我假設是)臨時存儲?

運行 PostgreSQL 13。

每次更新都會在 Postgres 中寫入一個新的行版本。 因此(除了 TOASTed 列)更新表中的每一行都會使其大小加倍。 那就是你觀察到的。 死元組稍后可以被清理以縮小表的物理大小 - 這就是VACUUM FULL所做的,代價高昂。

或者,您可能只是運行VACUUM FULL並將表保持在〜最小物理尺寸的兩倍。 如果您運行普通的VACUUM (沒有FULL !)足夠 - 如果您沒有長時間運行的事務阻塞 - Postgres 將在下一次UPDATE開始時在可用空間映射中標記死元組並且可以重用磁盤空間,因此保持在其最小尺寸的兩倍左右。 這比一直縮小和重新增長表要便宜得多,因為最昂貴的部分通常是物理增長表。

可能更好的是,將排名分解到一個最小的單獨 1:1 表中,這樣只需“每小時幾次”寫入最少的行。

暫無
暫無

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

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