2017-10-10 7 views
2

毎日大規模なテーブルから何十万ものレコードを削除してから、新しいデータを使って計算を行い、以前に削除したレコードをすべて置き換えます。私は普通のことだと思ったvacuum tblトリックを行うだろう。私はそれがサーバーにディスクスペースを返さないことを知っていますが、(私は削除していたレコードの数だけ挿入していたので、私は思っていました。しかし、テーブルを別の名前空間に移動させた後(無関係の理由で)、テーブルのサイズは117GBから44GBになりました。だから... ..."replacement inserts"のディスク節約戦略

はので、私のテーブルが膨らまず、これよりも優れた戦略があります:

delete from tbl where ...etc... -- hundreds of thousands of rows removed 
insert into tbl (...etc...) values (...etc...) -- hundreds of thousands of rows added back (fresh calcs) 

.. repeat the above about 10 times a day ... 

vacuum tbl 

https://www.postgresql.org/docs/9.6/static/sql-vacuum.html

のPostgreSQL 9.6

私は実際には、テーブルのサイズを小さくするためにやった中であります私の答えはここです: integer out of range and remaining disk space too small to convert id to bigint and other solutions

編集1: vacuum fullは私にとってはあまりにも制限されています。私は24/7のものを処理していますので、私はそのようなロックを持つことはできませんし、私の利用可能なディスクスペースは、任意の時点でかなり制限されています。これについてもっと良い方法でやろうとしています。

+0

絶対的なものは何もありません。いくつかの特定の基準によって、何かが何か他のものより優れている可能性があります。 'VACUUM FULL'は、CPU/IOとロックのコストのためにデータを圧縮するのに役立ちます。 – zerkms

+0

@zerkms - 私の編集を見てください1.ありがとう! – mountainclimber

答えて

2

あなたが探しているのは、私がそれを呼ぶのが好きな「デッドスペース平衡」です。 100万行を削除して置き換えたい場合は、さまざまな方法で行えます。あなたが100kを削除し、すぐに100kを挿入するとしましょう。データベースには古いデッド・ローをバキューム・アップする時間がないので、今度は1Mのロー・テーブルに100Kのデッド・ローがあります。次の24時間の間に真空が入り込み、それらを死にさせ、次回に削除/挿入すると、100k行以上の死んだ行が作成され、前回の100k行が再利用(大部分)されます。あなたの1M行テーブルは、今度は〜100kの不稼働列を再び持ち、次回に再利用されます。

削除/挿入(または更新)とvacuumがデッドタプルを作成/再利用する場所に均等に到達する必要があります。

+0

削除した後と挿入する前に真空がいっぱいであることを除いて真空引きする以外にもう一度感謝します! – mountainclimber

+1

はい、手動の掃除は非常に効果的です。しかし、デフォルトで手動での掃除は「冷やす」ことがないことに注意してください。私。システムが動作するのを待つことはありません。真空遅延が0のフルスロットルになります。あなたはalter databaseまたはpostgresql.confなどでvacuum_cost_delayを永久に設定することも、このセッションのためにvacuum_cost_delay = 5msなどで設定することもできます。遅れて遅くなりますが、他のプロセスがまだ作業を続けることができるようにIOサブシステムを非常に難しくすることはありません。 –

+0

私はそれを行います!手動で/プログラムでそれをやっているヒットが増えていたことは分かりませんでした。再度、感謝します! – mountainclimber