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