2017-02-02 11 views
3

Postgres-9.5を実行中です。私は大きなテーブルを持っています。私はALTER TABLE table SET UNLOGGEDをやっています。 FK参照テーブルは未ログにできないので、すでにテーブルを対象としたすべての外部キー制約を削除しました。クエリは約20分かかり、CPUを100%消費しました。テーブルをログに記録するのに長い時間を要することは理解できますが、ログに記録されないようにするのは難しくありませんが、それはどうですか?Postgres SET UNLOGGEDに時間がかかります

テーブルを未記録にすることをより速くするためにできることはありますか?

+0

ロックを待っていますか? https://wiki.postgresql.org/wiki/Lock_Monitoring –

+0

私は数秒ごとに 'pg_stat_activity'をクエリして監視していましたが、' waiting'カラムがtrueに設定されていないことを確認しました。それは待っていない。また、孤立したテストデータベースに入って以来、他のクエリがまったく実行されていないことも知っています。 – sudo

+0

@NickBarnesああ、それは解決策です。私には不思議なことに、未記録を設定するには書き換えが必要だと思われますが、Postgresがどのようにして動作するのかは分かりません。 – sudo

答えて

4

SET UNLOGGEDにはテーブルの書き換えが含まれているため、大きなテーブルの場合はかなり時間がかかります。

あなたが言ったように、それはテーブルを作るようには思われませんUNLOGGEDそれは難しいはずです。そして単にテーブルを変換するのは難しいです。です。複雑な要因は、クラッシュセーフにする必要があることです。 UNLOGGEDテーブルにはそれに関連付けられた追加のファイル(init fork)があり、このファイルの作成を残りのコミットと同期させる方法はありません。

代わりに、SET UNLOGGEDは、initフォークを添付してテーブルのコピーを作成して、コミットがアトミックに処理できる新しいrelfilenodeにスワップします。より効率的な実装は可能ですが、未ログテーブル(かなり前にSET UNLOGGEDになる)またはCOMMITの背後にあるロジックを変更することなく、この比較的小さな機能にはあまりにも邪魔になるとは思われませんでした。 pgsql-hackers listのデザインの背後にあるディスカッションを読むことができます。 テーブルを作成し、すべてのレコードをコピーし、最後のいくつかの変更を同期させながら古いテーブルを一時的にロックしてから、完了したらRENAMEで新しいテーブルを交換してください。

関連する問題