Конфигурации Postgres
Стратегии инкрементальной материализации
В dbt-postgres поддерживаются следующие стратегии инкрементальной материализации:
append
(по умолчанию, еслиunique_key
не определен)merge
delete+insert
(по умолчанию, еслиunique_key
определен)microbatch
Оптимизация производительности
Unlogged
"Unlogged" таблицы могут быть значительно быстрее обычных таблиц, так как они не записываются в журнал предзаписи и не реплицируются на реплики для чтения. Однако они также значительно менее безопасны, чем обычные таблицы. Подробности см. в документации Postgres.
{{ config(materialized='table', unlogged=True) }}
select ...
models:
+unlogged: true
Индексы
Хотя Postgres работает достаточно хорошо для наборов данных размером менее 10 миллионов строк, иногда требуется настройка базы данных. Важно создавать индексы для столбцов, которые часто используются в соединениях или в условиях where.
Модели таблиц, инкрементальные модели, seeds, snapshots и материализованные представления могут иметь список определенных indexes
. Каждый индекс Postgres может иметь три компонента:
columns
(список, обязательный): один или несколько столбцов, по которым определяется индексunique
(логический, необязательный): должен ли индекс быть объявлен уникальнымtype
(строка, необязательный): поддерживаемый тип индекса (B-tree, Hash, GIN и т.д.)
{{ config(
materialized = 'table',
indexes=[
{'columns': ['column_a'], 'type': 'hash'},
{'columns': ['column_a', 'column_b'], 'unique': True},
]
)}}
select ...
Если один или несколько индексов настроены на ресурсе, dbt выполнит оператор(ы) create index
как часть этого ресурса, в рамках той же транзакции, что и основной оператор create
. Для имени индекса dbt использует хэш его свойств и текущую временную метку, чтобы гарантировать уникальность и избежать конфликта имен с другими индексами.
create index if not exists
"3695050e025a7173586579da5b27d275"
on "my_target_database"."my_target_schema"."indexed_model"
using hash
(column_a);
create unique index if not exists
"1bf5f4a6b48d2fd1a9b0470f754c1b0d"
on "my_target_database"."my_target_schema"."indexed_model"
(column_a, column_b);
Вы также можете настроить индексы для нескольких ресурсов одновременно:
models:
project_name:
subdirectory:
+indexes:
- columns: ['column_a']
type: hash
Материализованные представления
Адаптер Postgres поддерживает материализованные представления с следующими параметрами конфигурации:
Параметр | Тип | Обязательный | По умолчанию | Поддержка мониторинга изменений |
---|---|---|---|---|
on_configuration_change | <string> | нет | apply | н/д |
indexes | [{<dictionary>}] | нет | none | alter |
- Файл проекта
- Файл свойств
- Блок конфигурации
models:
<resource-path>:
+materialized: materialized_view
+on_configuration_change: apply | continue | fail
+indexes:
- columns: [<column-name>]
unique: true | false
type: hash | btree
version: 2
models:
- name: [<model-name>]
config:
materialized: materialized_view
on_configuration_change: apply | continue | fail
indexes:
- columns: [<column-name>]
unique: true | false
type: hash | btree
{{ config(
materialized="materialized_view",
on_configuration_change="apply" | "continue" | "fail",
indexes=[
{
"columns": ["<column-name>"],
"unique": true | false,
"type": "hash" | "btree",
}
]
) }}
Параметр indexes
соответствует параметру таблицы, как объяснено выше.
Стоит отметить, что, в отличие от таблиц, dbt отслеживает этот параметр на предмет изменений и применяет изменения без удаления материализованного представления.
Это происходит через DROP/CREATE
индексов, что можно рассматривать как ALTER
материализованного представления.
Узнайте больше об этих параметрах в документации Postgres.