2017-09-14 52 views
1

我一直在使用的Postgres,而现在这个触发器会做,但我还没有实现任何触发器呢。我想检查这是否会做我打算做的事情。确认,如果我打算

在日常基础上,我加入新行的表(COPY),并同时更新现有行,如果有一个主键冲突(ON冲突DO UPDATE SET)。然后,我有使用该表和其他几个加入一个物化视图,该视图用于很多报告。

我希望在原来的表已经更新,而不需要我来安排,或手动运行它的物化视图进行更新。 (现在我已经使用Python psycopg2 execute命令安排它)。

CREATE OR REPLACE FUNCTION refresh_mat_view() 
RETURNS TRIGGER LANGUAGE plpgsql 
AS $$ 
BEGIN 
    REFRESH MATERIALIZED VIEW schema_name.materialized_view_name; 
    RETURN NULL; 
END $$; 

CREATE TRIGGER refresh_view 
AFTER INSERT OR UPDATE OR DELETE OR TRUNCATE 
ON sutherland.dimension_peoplesoft FOR EACH STATEMENT 
EXECUTE PROCEDURE refresh_mat_view(); 

那会刷新每个单行这是更新过的观点?我只是想象它会触发每个行可能100k +刷新。这将是更好的情况发生,毕竟刀片已经完成(我有Python中的每一行循环的熊猫数据帧到UPSERT到数据库)。

+0

您显示的代码没有帮助。您可以将您的表约束定义为INITIALLY DEFERRED。交易分界也有影响。 – blafasel

回答

0

当您使用纯粹的物化视图时,每次刷新它时,它都会重建整个事物。因此,如果您的数据变化很大,而且您需要快速提供数据,那么这不是一个最佳选择。

您应该使用基本上是“充分利用触发器”的Eager实体化视图或惰性实体化视图。显然,这是很难做的比纯物化视图,但效果更好(根据使用的情况下)。

您应该检查这篇文章Materialized View Strategies Using PostgreSQL