2

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

4

2 回答 2

3

这个答案来自 DBT 的 Claire。

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

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

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

于 2020-06-23T13:34:00.333 回答
1

正如前面的答案所述,当由于级联而删除表时,物化视图将被删除。

获得更高正常运行时间的桥梁是让表充当正在重建的 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 %}
于 2021-01-11T16:18:22.500 回答