我有一个名为price_changes
的物化视图,用于一些报告。我还有一个cron作业,用于刷新refresh materialized view price_changes
的物化视图。一切都运行得很好。
我想给予查看报告的用户一条消息“Data is fresh as of X”。我可以在cron运行时将其存储在某个地方,但是postgres是否已经将此元数据存储在某个地方了呢?
我有一个名为price_changes
的物化视图,用于一些报告。我还有一个cron作业,用于刷新refresh materialized view price_changes
的物化视图。一切都运行得很好。
我想给予查看报告的用户一条消息“Data is fresh as of X”。我可以在cron运行时将其存储在某个地方,但是postgres是否已经将此元数据存储在某个地方了呢?
6条答案
按热度按时间fhg3lkii1#
我认为9.3.4版的系统中没有内置任何内容提供此功能。当我需要提供上次刷新的日期时,我在实体化视图的选择查询中添加了一个名为'last_refresh'的列,因为实体化视图中的数据在刷新之前不会更改。
出于安全原因,我也更喜欢这样做,因为如果信息存储在系统表中,您可能不想给予sql用户对系统表的访问权限。
根据您是否需要时间,您可以使用以下任一方法:
now()
now()
个仅限日期:
包含日期和时间:
PostgreSQL版本9.4+现在包括
CONCURRENTLY
选项。如果你使用REFRESH MATERIALIZED VIEW CONCURRENTLY
选项,请注意@Smudge在注解中所指示的内容。这实际上只会对大型和频繁更新的数据集造成问题。如果你的数据集很小或很少更新,那么你应该没问题。xmd2e60i2#
由于具体化视观表是储存在磁盘上的数据区段,因此它们在文件系统中会有一个Map的档案。当您呼叫
REFRESH MATERIALIZED VIEW
时,磁盘上的数据会以新的文件名称重新建立。因此,您可以在pg_class
中交叉参照relfilenode
,以查询视观表的修改/建立时戳:3phpmpom3#
e1xvtsh34#
我认为@richyen解决方案是最好的,如果你能访问服务器。
如果你不这样做,你必须采取手动存储上次刷新日期作为元数据的方式。
kx1ctssn5#
感谢您@ajaest的帮助。我们的生产环境有许多示例。我们必须防止实体化竞争,刷新速度不能超过50秒。这是我们的解决方案。我们使用了对实体化视图的评论
pgvzfuti6#
从CLI
让我们首先为要检查的示例化视图及其所属的数据库声明一些变量。
接下来,我们需要找到实体化视图的id,可以通过查询
pg_class
表来完成。在下面的示例化w查询中,将
<materialized_view_name>
替换为示例化视图的名称现在我们可以找到示例化视图的文件路径,从而找到它的最后更新时间。
额外的好处:有时服务器的时区可能与您的本地机器不同。您可以通过运行以下命令来获得对服务器时区的引用。