Перейти к основному содержимому

Конфигурации Postgres

Стратегии инкрементальной материализации

В dbt-postgres поддерживаются следующие стратегии инкрементальной материализации:

  • append (по умолчанию, если unique_key не определен)
  • merge
  • delete+insert (по умолчанию, если unique_key определен)
  • microbatch

Оптимизация производительности

Unlogged

"Unlogged" таблицы могут быть значительно быстрее обычных таблиц, так как они не записываются в журнал предзаписи и не реплицируются на реплики для чтения. Однако они также значительно менее безопасны, чем обычные таблицы. Подробности см. в документации Postgres.

my_table.sql
{{ config(materialized='table', unlogged=True) }}

select ...
dbt_project.yml
models:
+unlogged: true

Индексы

Хотя Postgres работает достаточно хорошо для наборов данных размером менее 10 миллионов строк, иногда требуется настройка базы данных. Важно создавать индексы для столбцов, которые часто используются в соединениях или в условиях where.

Модели таблиц, инкрементальные модели, seeds, snapshots и материализованные представления могут иметь список определенных indexes. Каждый индекс Postgres может иметь три компонента:

  • columns (список, обязательный): один или несколько столбцов, по которым определяется индекс
  • unique (логический, необязательный): должен ли индекс быть объявлен уникальным
  • type (строка, необязательный): поддерживаемый тип индекса (B-tree, Hash, GIN и т.д.)
my_table.sql
{{ 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);

Вы также можете настроить индексы для нескольких ресурсов одновременно:

dbt_project.yml
models:
project_name:
subdirectory:
+indexes:
- columns: ['column_a']
type: hash

Материализованные представления

Адаптер Postgres поддерживает материализованные представления с следующими параметрами конфигурации:

ПараметрТипОбязательныйПо умолчаниюПоддержка мониторинга изменений
on_configuration_change<string>нетapplyн/д
indexes[{<dictionary>}]нетnonealter
dbt_project.yml
models:
<resource-path>:
+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.

0