データベースのメンテナンススクリプトを作成しました。毎日のダウンタイム中にバキューム/インデックスの再作成が最も必要なテーブルでそのスクリプトを実行したいと思います。postgres内でそれを判断する方法はありますか?
私はこのように注意が必要なテーブルを分類します:
- 掃除機が必要なテーブル
- インデックスの再作成が必要なテーブル(これによりパフォーマンスに大きな違いが生じることがわかります)
ここで大まかに有望なものが見えます
データベースのメンテナンススクリプトを作成しました。毎日のダウンタイム中にバキューム/インデックスの再作成が最も必要なテーブルでそのスクリプトを実行したいと思います。postgres内でそれを判断する方法はありますか?
私はこのように注意が必要なテーブルを分類します:
ここで大まかに有望なものが見えます
自動掃除機を再発明しようとしているようです。それを有効にして、それを仕事に任せることができない理由は何ですか?
必要な実際の情報については、pg_stat_all_tablesおよびpg_stat_all_indexesを参照してください。
その中のデータを使用する方法の良い例については、自動バキュームのソースを見てください。ビューを直接クエリすることはありませんが、その情報を使用します。
CRUD アクションの後に実行される同じトリガー関数をすべてのテーブルに追加するのはどうでしょうか。
この関数はテーブル名を受け取り、テーブルのステータスをチェックしてから、そのテーブルでバキュームまたは再インデックスを実行します。
「単純な」pl/sqlトリガーである必要がありますが、それらは決して単純ではありません...
また、DB マシンが十分に強力で、ダウンタイムが十分に長い場合は、毎晩スクリプトを実行してすべてのインデックスを再作成し、すべてをバキュームします...そのようにして、テスト時間 (夜) に基準が満たされていない場合でも、はそれに近かった(基準より少ない数のレコード)、基準に達した翌日に問題が発生することはありません...
自動バキュームを検討する必要があると思います。
しかし、私があなたのニーズを正しく理解していれば、それが私がすることです:
たとえば、talbe 'foo' は、X 個の新しいレコードごとにインデックスを再作成し、X 個の更新、削除、または挿入ごとにバキュームする必要があります。
毎日テーブルのステータスをチェックし、それをログに保存して (時間の経過に伴う行の違いを比較するため)、基準に一致するテーブルを再インデックス化/バキュームします。
少しハッキングに聞こえますが、これは良い方法だと思いますcustom-autovacuum-with-custom-'triggers'-criteria