2014-01-16 345 views
12

一部のレポートにはprice_changesというマテリアライズド・ビューが使用されています。私はまた、refresh materialized view price_changesでマテリアライズド・ビューをリフレッシュするcronジョブを得ました。すべてがうまくいっています。マテリアライズド・ビューの最新のリフレッシュ時間の確認

私は、レポートを見ているユーザーに "Xのデータは新鮮な"というメッセージを与えたいと思います。私はcronを実行するときにどこかに格納することができましたが、postgresはすでにこのメタデータをどこかに保存していますか?

+0

詳細については、https://dba.stackexchange.com/q/58214/104401 – Wildcard

答えて

9

9.3.4以降でこれを提供するシステムには何も組み込まれていないと思います。最後のリフレッシュの日付を指定する必要がある場合、マテリアライズド・ビューのデータはリフレッシュされるまで変更されないため、「last_refresh」という列をマテリアライズド・ビューのselect問合せに追加します。

また、情報がそこに格納されている場合、システムテーブルへのSQLユーザーのアクセスを許可したくない場合があるので、セキュリティ上の理由からこの方法をお勧めします。

あなたは時間が必要な場合、あなたはどちらかを使用することができますによって:

  1. CURRENT_DATE
  2. now()

ジャスト日:

CREATE MATERIALIZED VIEW mv_address AS 
SELECT *, CURRENT_DATE AS last_refresh FROM address;

日付と時刻:

CREATE MATERIALIZED VIEW mv_address AS 
SELECT *, now() AS last_refresh FROM address;

アップデート2017年2月17日:

PostgreSQLバージョン9.4+今CONCURRENTLYオプションが含まれています。 REFRESH MATERIALIZED VIEW CONCURRENTLYオプションを使用する場合は、コメントに@Smudgeが示した内容に注意してください。これは実際には大規模で頻繁に更新されるデータセットの場合にのみ問題になります。あなたのデータセットが小さい、またはまれに更新されていれば、うまくいくはずです。

+8

を参照してください。このアプローチでは、毎回すべての行を更新するために、「リフレッシュマテリアライズビュー連続」が発生します。頻繁に更新されない小規模のデータセットの場合、これは大きな問題ではありませんが、多くのデータや頻繁な更新では、 'DELETE'と' INSERT'の割合が自動バキュームデーモンのテーブルをVACUUMする能力を追い越し、基本的なクエリのパフォーマンスが急上昇します。 – Smudge

+6

現実世界の経験から言えば、Smudgeは、あなたのデータベースが死んだタプルの山を扱う時間の100%を費やし、マテリアライズド・ビューを削除して再作成するまで回復できないまで、非常に簡単にスノーボールを参照しています。このソリューションは非常に注意して使用してください。 – Jschiff

関連する問題