大佬教程收集整理的这篇文章主要介绍了在PostgreSQL中逐步刷新materalized视图,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
create table graph ( xaxis Integer NOT NulL,value integer NOT NulL,); CREATE MATERIAliZED VIEW graph_avg AS SELECT xaxis,AVG(value) FROR_178_11845@ graph GROUP BY xaxis@H_675_1@定期将新值添加到图形或更新现有值.我想每隔几个小时刷新一次视图graph_avg,仅用于已更新的值.但是在PostgreSQL 9.3中,整个表都刷新了.这非常耗时.下一个版本9.4允许CONCURRENT更新,但它仍然刷新整个视图.拥有数百万行,这需要几分钟. @H_675_1@什么是跟踪更新和更新的好方法新值,只部分刷新视图?
create view graph_avg_vIEw AS SELECT xaxis,AVG(value) AS avg_val FROM graph GROUP BY xaxis;@H_675_1@并将结果作为一个整体或在您需要重新开始时实现:
create table graph_avg AS SELECT * FROM graph_avg_vIEw@H_675_1@(或者直接使用SELECT语句,而不创建VIEW.)
WITH del AS ( deletE FROM graph_avg t WHERE NOT EXISTS (SELECT 1 FROM graph_avg_vIEw v WHERE v.xaxis = v.xaxis); ),upd AS ( updatE graph_avg t FROM graph_avg_vIEw v WHERE t.xaxis = v.xaxis AND t.avg_val <> v.avg_val ) INSERT INTO graph_avg t SELECT * FROM graph_avg_vIEw v left JOIN graph_avg t USING (xaxis) WHERE t.xaxis IS NulL;@H_675_1@但这应该最有可能得到优化. @H_675_1@基本配方: @H_675_1@>将默认Now()的timestamp列添加到基表.我们称之为ts. @H_675_1@>如果您有更新,请添加触发器以设置每次更改xaxis或值的更新的当前时间戳. @H_675_1@>创建一个小表来记住最新快照的时间戳.我们称之为mv:
create table mv ( tbl text PRIMary KEY,ts timestamp NOT NulL DEFAulT '-infinity' ); -- possibly more details@H_675_1@>创建此部分多列索引:
CREATE INDEX graph_mv_latest ON graph (xaxis,value) WHERE ts >= '-infinity';@H_675_1@>使用上一个快照的时间戳作为查询中的谓词,以使用完美的索引用法刷新快照.>在事务结束时,删除索引并使用事务时间戳重新创建它,替换索引谓词中的时间戳(最初为“-infinity”),您也将其保存到表中.一次交易中的一切.>请注意,部分索引可以很好地覆盖INSERT和update操作,但不能覆盖deletE.为了解决这个问题,您需要考虑整个表格.这完全取决于具体要求.
以上是大佬教程为你收集整理的在PostgreSQL中逐步刷新materalized视图全部内容,希望文章能够帮你解决在PostgreSQL中逐步刷新materalized视图所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。