【问题标题】:DBT full refresh drops all my materialized views. PostgresDBT 完全刷新会丢弃我所有的物化视图。 Postgres
【发布时间】:2020-09-06 02:30:06
【问题描述】:

我们正在使用 DBT 来管理我们的数据管道。我们也使用 postgres 作为我们的数据库。我正在通过查询(不在 dbt 中)创建一些物化视图,看起来每当我们运行 dbt run --full-refresh 时,它都会删除这些物化视图。知道为什么以及如何不丢弃物化视图吗?

【问题讨论】:

  • 你能分享更多关于设置的信息吗?您是否在 DBT 托管模式中构建物化视图?您的数据库的树形结构在这里会有所帮助。 DBT 实例本身呢?您是否将现有物化视图的模式设置为源?

标签: sql postgresql dbt


【解决方案1】:

这个答案来自 DBT 的 Claire。

“如果物化视图依赖于上游表,它们将被 drop table my_table 级联语句删除”

这来自 DBT 的 Jake。 “postgres 视图/物化视图具有约束力。没有选择退出,即使在同一个 dbt 运行中重新创建它们也会导致它不可用的时间段。”

https://www.postgresql.org/docs/9.3/rules-materializedviews.html https://docs.getdbt.com/

【讨论】:

  • 这里的附加颜色:--full-refresh 实际上意味着模式(dbt 环境的目标模式)被删除,并且它上面的所有内容都将由 DBT 重新创建。 @user2491463 在与 dbt 目标模式不同的模式上创建物化视图是一个选项吗?
【解决方案2】:

正如前面的回答所说,当一个表因为级联而被删除时,物化视图也会被删除。

获得更高正常运行时间的桥梁是让表充当正在重建的 dbt 表的副本,然后在重建时删除和更新这些表。

重建表时的停机时间可能值得知道何时重建表的确定性行为,而不是在长时间重建期间物化视图消失。

这是我为解决这个问题而编写的宏。它会在单个事务中创建一个名称略有不同的新表,从而实现 100% 的正常运行时间。

{% macro create_table(table_name) %}

{% set sql %}
    BEGIN;
    DROP TABLE IF EXISTS {{ table_name[:-4]}};
    CREATE TABLE {{ table_name[:-4]}} AS SELECT * FROM {{ table_name }};

    COMMIT;
{% endset %}

{% do run_query(sql) %}
{% do log(table_name+" table created", info=True) %}
{% endmacro %}

【讨论】:

    猜你喜欢
    • 2018-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-03
    • 2017-06-15
    • 1970-01-01
    • 2017-05-18
    相关资源
    最近更新 更多