确认此触发器是否按照我的意图执行

时间:2017-09-14 13:51:12

标签: postgresql

我一直在使用Postgres一段时间了,但我还没有实现任何触发器。我想检查一下这是否符合我打算做的事情。

每天,我向表中添加新行(COPY),如果存在主键冲突(ON CONFLICT DO UPDATE SET),还会更新现有行。然后我使用该表和一些其他连接具有物化视图,并且该视图用于大量报告。

我希望在更新原始表时更新实例化视图,而无需我安排或手动运行它。 (现在我用Python psycopg2执行命令安排它。)

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循环遍历pandas DataFrame中的每一行到UPSERT进入数据库)。

1 个答案:

答案 0 :(得分:0)

当您使用纯物化视图时,每次刷新它时,它都会重建整个物体。因此,如果您的数据发生了很大变化,并且您需要快速获得数据,那么这不是一个优化的选择。

你应该使用Eager Materialized Views或Lazy Materialized Views,它们基本上是"充分利用触发器"。显然,它比纯粹的物化视图更难做,但结果更好(取决于使用的情况)。

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