2017-06-28 21 views
2

はI 9万行でPostgresのテーブルへの完全VACUUMを実行していると私はこの背中を得た:Postgresの真空出力のリムーバブルな意味は何ですか?

INFO: vacuuming "osm.asp_trs_roads_osm" 
INFO: "asp_trs_roads": found 329992 removable, 9660438 nonremovable row versions in 761738 pages 

詳細:0死んで行バージョンがまだ削除することはできません。 CPU 8.98秒/ 13.06秒経過549.77秒 クエリは成功し、結果は991788ミリ秒で返されました。

「329992リムーバブル」とはどういう意味ですか?そして、なぜ私は取得するのですか?

テーブルがインデックスされていて、主キーがありますが、クエリの実行が非常に遅いです。

答えて

2

ロー(変更、削除)を変更したときの私の知識よりも、古いバージョンは他のトランザクション(同じ物理的な場所)で使用されている場合、古いバージョンは不要です。行 - それは取り外し可能になります。

申し訳ありません - 私はそれが権利を取得した場合、ドキュメント

で明確な記述を見つけることができません - 取り外し可能な真空のanalyze部分によって示され、そして死んだ行が削除され、実際のvacuum一部で示されていません。

2

簡単に言えば、テーブルのデータを更新または削除すると、PostgreSQLはすぐにテーブルを削除せず、テーブルにマークしただけです。 Vacuumコマンドはガベージコレクタとして、それらのテーブルを通過してディスクスペースを回復するために削除されます。

あなたはより多くの詳細情報については、Wikiの中の真空についての文書を読むことができます:

0 dead row versions cannot be removed yet.

:ログに、この出力に関する他の人が既に答えたものに加えて

https://wiki.postgresql.org/wiki/Introduction_to_VACUUM,_ANALYZE,_EXPLAIN,_and_COUNT

2

updateまたはdeleteがすべての行で実行されると、その行の新しいバージョンが作成され、トランザクションが完了すると前の行を置き換えますmitted。更新/削除を実行する前に開始されたトランザクションは、古い行バージョン(transaction isolationレベルに応じて)を引き続き参照することがあります。したがって、それらのバージョンがどれも表示されなくなるまで、それらのバージョンを削除することはできません。

これらのケースに関するログレポート:あなたの例では、他のトランザクションによってアクセスされる可能性があるため、削除できなかった行バージョンはありません。

これはrelated questionを参照してください。

関連する問題