> ## Documentation Index
> Fetch the complete documentation index at: https://private-7c7dfe99-revert-104359-revert-104251-parquet-single.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

> Доступные материализации и их конфигурации

# Материализации

export const ClickHouseSupportedBadge = () => {
  return <div className="ClickHouseSupportedBadge">
            <div className="ClickHouseSupportedIcon">
                <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
                    <path d="M1.30762 1.39073C1.30762 1.3103 1.37465 1.22986 1.46849 1.22986H2.64824C2.72868 1.22986 2.80912 1.29689 2.80912 1.39073V14.4886C2.80912 14.5691 2.74209 14.6495 2.64824 14.6495H1.46849C1.38805 14.6495 1.30762 14.5825 1.30762 14.4886V1.39073Z" fill="currentColor" />
                    <path d="M4.2832 1.39073C4.2832 1.3103 4.35023 1.22986 4.44408 1.22986H5.62383C5.70427 1.22986 5.7847 1.29689 5.7847 1.39073V14.4886C5.7847 14.5691 5.71767 14.6495 5.62383 14.6495H4.44408C4.36364 14.6495 4.2832 14.5825 4.2832 14.4886V1.39073Z" fill="currentColor" />
                    <path d="M7.25977 1.39073C7.25977 1.3103 7.3268 1.22986 7.42064 1.22986H8.60039C8.68083 1.22986 8.76127 1.29689 8.76127 1.39073V14.4886C8.76127 14.5691 8.69423 14.6495 8.60039 14.6495H7.42064C7.3402 14.6495 7.25977 14.5825 7.25977 14.4886V1.39073Z" fill="currentColor" />
                    <path d="M10.2354 1.39073C10.2354 1.3103 10.3024 1.22986 10.3962 1.22986H11.576C11.6564 1.22986 11.7369 1.29689 11.7369 1.39073V14.4886C11.7369 14.5691 11.6698 14.6495 11.576 14.6495H10.3962C10.3158 14.6495 10.2354 14.5825 10.2354 14.4886V1.39073Z" fill="currentColor" />
                    <path d="M13.2256 6.6057C13.2256 6.52526 13.2926 6.44482 13.3865 6.44482H14.5662C14.6466 6.44482 14.7271 6.51186 14.7271 6.6057V9.27354C14.7271 9.35398 14.6601 9.43442 14.5662 9.43442H13.3865C13.306 9.43442 13.2256 9.36739 13.2256 9.27354V6.6057Z" fill="currentColor" />
                </svg>
            </div>
            Поддерживается в ClickHouse
        </div>;
};

<ClickHouseSupportedBadge />

В этом разделе описаны все материализации, доступные в dbt-clickhouse, включая экспериментальные возможности.

<h2 id="general-materialization-configurations">
  Общие конфигурации материализаций
</h2>

В следующей таблице показаны конфигурации, общие для некоторых доступных материализаций. Подробную информацию об общих конфигурациях моделей dbt см. в [документации dbt](https://docs.getdbt.com/category/general-configs):

| Option | Description | Default if any |
| - | - | - |
| engine | Движок таблицы (тип таблицы), который используется при создании таблиц | `MergeTree()` |
| order\_by | Кортеж имён столбцов или произвольных выражений. Это позволяет создать небольшой разреженный индекс, который помогает быстрее находить данные. | `tuple()` |
| partition\_by | Партиция — это логическое объединение записей в таблице по заданному критерию. Ключом партиционирования может быть любое выражение на основе столбцов таблицы. | |
| primary\_key | Как и order\_by, это выражение первичного ключа ClickHouse. Если оно не указано, ClickHouse будет использовать выражение order\_by в качестве первичного ключа | |
| settings | Словарь настроек "TABLE", который используется с DDL-операторами, такими как 'CREATE TABLE', для этой модели | |
| query\_settings | Словарь пользовательских настроек уровня пользователя ClickHouse, который используется с операторами `INSERT` или `DELETE` вместе с этой моделью | |
| ttl | Выражение TTL, используемое с таблицей. Выражение TTL представляет собой строку, с помощью которой можно задать TTL для таблицы. | |
| sql\_security | Пользователь ClickHouse, которого следует использовать при выполнении запроса, лежащего в основе представления. [Допустимые значения](/ru/reference/statements/create/view#sql_security): `definer`, `invoker`. | |
| definer | Если для `sql_security` установлено значение `definer`, необходимо указать любого существующего пользователя или `CURRENT_USER` в предложении `definer`. | |

<h3 id="supported-table-engines">
  Поддерживаемые движки таблиц
</h3>

| Тип | Подробности |
| - | - |
| MergeTree (по умолчанию) | [документация](/ru/reference/engines/table-engines/mergetree-family/mergetree). |
| HDFS | [документация](/ru/reference/engines/table-engines/integrations/hdfs) |
| MaterializedPostgreSQL | [документация](/ru/reference/engines/table-engines/integrations/materialized-postgresql) |
| S3 | [документация](/ru/reference/engines/table-engines/integrations/s3) |
| EmbeddedRocksDB | [документация](/ru/reference/engines/table-engines/integrations/embedded-rocksdb) |
| Hive | [документация](/ru/reference/engines/table-engines/integrations/hive) |

**Примечание**: для материализованных представлений поддерживаются все движки \*MergeTree.

<h4 id="experimental-supported-table-engines">
  Экспериментально поддерживаемые движки таблиц
</h4>

| Тип | Подробности |
| - | - |
| Distributed таблица | [документация](/ru/reference/engines/table-engines/special/distributed). |
| словарь | [документация](/ru/reference/engines/table-engines/special/dictionary) |

Если при подключении dbt к ClickHouse с использованием одного из указанных выше движков у вас возникают проблемы, сообщите о них [здесь](https://github.com/ClickHouse/dbt-clickhouse/issues).

<h3 id="a-note-on-model-settings">
  Примечание о настройках модели
</h3>

В ClickHouse есть несколько типов/уровней «настроек». В приведенной выше конфигурации модели можно настраивать два их типа.
`settings` означает предложение `SETTINGS`,
используемое в DDL-операторах типа `CREATE TABLE/VIEW`, то есть обычно это настройки, специфичные для
конкретного движка таблицы ClickHouse. Новый
`query_settings` используется для добавления предложения `SETTINGS` в запросы `INSERT` и `DELETE`, применяемые при материализации модели (
включая инкрементные материализации).
Существуют сотни настроек ClickHouse, и не всегда очевидно, какая из них является настройкой таблицы, а какая — настройкой пользователя
(хотя последние, как правило,
доступны в таблице `system.settings`.) В целом рекомендуется использовать значения по умолчанию, а к использованию этих свойств
следует подходить только после тщательного изучения и тестирования.

<h3 id="column-configuration">
  Конфигурация столбца
</h3>

> ***ПРИМЕЧАНИЕ:*** Чтобы использовать указанные ниже параметры конфигурации столбца, необходимо включить [контракты моделей](https://docs.getdbt.com/docs/collaborate/govern/model-contracts).

| Параметр | Описание | Значение по умолчанию, если есть |
| - | - | - |
| codec | Строка, содержащая аргументы, передаваемые в `CODEC()` в DDL столбца. Например: `codec: "Delta, ZSTD"` будет скомпилировано как `CODEC(Delta, ZSTD)`. | |
| ttl | Строка, содержащая [TTL-выражение (time-to-live)](/ru/concepts/features/operations/delete/ttl), которое задаёт правило TTL в DDL столбца. Например: `ttl: ts + INTERVAL 1 DAY` будет скомпилировано как `TTL ts + INTERVAL 1 DAY`. | |

<h4 id="example-of-schema-configuration">
  Пример конфигурации схемы
</h4>

```yaml theme={null}
models:
  - name: table_column_configs
    description: 'Testing column-level configurations'
    config:
      contract:
        enforced: true
    columns:
      - name: ts
        data_type: timestamp
        codec: ZSTD
      - name: x
        data_type: UInt8
        ttl: ts + INTERVAL 1 DAY
```

<h4 id="adding-complex-types">
  Добавление сложных типов
</h4>

dbt автоматически определяет тип данных каждого столбца, анализируя SQL, используемый для создания модели. Однако в некоторых случаях этот процесс может определять тип данных неточно, что приводит к конфликтам с типами, указанными в свойстве `data_type` контракта. Чтобы избежать этого, мы рекомендуем использовать функцию `CAST()` в SQL модели, чтобы явно указать нужный тип. Например:

```sql theme={null}
{{
    config(
        materialized="materialized_view",
        engine="AggregatingMergeTree",
        order_by=["event_type"],
    )
}}

select
  -- event_type may be infered as a String but we may prefer LowCardinality(String):
  CAST(event_type, 'LowCardinality(String)') as event_type,
  -- countState() may be infered as `AggregateFunction(count)` but we may prefer to change the type of the argument used:
  CAST(countState(), 'AggregateFunction(count, UInt32)') as response_count,
  -- maxSimpleState() may be infered as `SimpleAggregateFunction(max, String)` but we may prefer to also change the type of the argument used:
  CAST(maxSimpleState(event_type), 'SimpleAggregateFunction(max, LowCardinality(String))') as max_event_type
from {{ ref('user_events') }}
group by event_type
```

<h2 id="materialization-view">
  Материализация: представление
</h2>

Модель dbt можно создать как [представление ClickHouse](/ru/reference/functions/table-functions/view)
и настроить, используя следующий синтаксис:

Файл проекта (`dbt_project.yml`):

```yaml theme={null}
models:
  <resource-path>:
    +materialized: view
```

Или блок `config` (`models/<model_name>.sql`):

```python theme={null}
{{ config(materialized = "view") }}
```

<h2 id="materialization-table">
  Материализация: таблица
</h2>

Модель dbt можно создать в виде [таблицы ClickHouse](/ru/reference/system-tables/tables) и
настроить, используя следующий синтаксис:

Файл проекта (`dbt_project.yml`):

```yaml theme={null}
models:
  <resource-path>:
    +materialized: table
    +order_by: [ <column-name>, ... ]
    +engine: <engine-type>
    +partition_by: [ <column-name>, ... ]
```

Или блок config (`models/<model_name>.sql`):

```python theme={null}
{{ config(
    materialized = "table",
    engine = "<engine-type>",
    order_by = [ "<column-name>", ... ],
    partition_by = [ "<column-name>", ... ],
      ...
    ]
) }}
```

<h3 id="data-skipping-indexes">
  Индексы пропуска данных
</h3>

Вы можете добавлять [индексы пропуска данных](/ru/concepts/features/performance/skip-indexes/skipping-indexes) к материализациям `table`, используя конфигурацию `indexes`:

```sql theme={null}
{{ config(
        materialized='table',
        indexes=[{
          'name': 'your_index_name',
          'definition': 'your_column TYPE minmax GRANULARITY 2'
        }]
) }}
```

<h3 id="projections">
  Проекции
</h3>

Вы можете добавлять [проекции](/ru/concepts/features/projections/projections) в материализации `table` и `distributed_table` с помощью конфигурации `projections`. Для каждой записи проекции требуется ключ `query` или `index` (но не оба).

**Примечание**: Для distributed таблиц проекция применяется к таблицам `_local`, а не к прокси-таблице distributed.
**Примечание**: Указание одновременно `query` и `index` в одной записи проекции вызывает ошибку на этапе компиляции.

<h4 id="query-projections">
  Проекции запросов
</h4>

Используйте `query`, чтобы задать полный запрос проекции:

```sql theme={null}
{{ config(
       materialized='table',
       projections=[
           {
               'name': 'your_projection_name',
               'query': 'SELECT department, avg(age) AS avg_age GROUP BY department'
           }
       ]
) }}
```

<h4 id="index-projections">
  Индексные проекции
</h4>

Используйте `index` как синтаксический сахар для легковесных [индексных проекций](https://clickhouse.com/blog/clickhouse-release-25-06#index-projections), использующих виртуальный столбец `_part_offset`. В качестве ключа сортировки укажите имя одного столбца или список столбцов:

```sql theme={null}
{{ config(
       materialized='table',
       projections=[
           {
               'name': 'proj_by_age',
               'index': 'age'
           }
       ]
) }}
```

```sql theme={null}
{{ config(
       materialized='table',
       projections=[
           {
               'name': 'proj_by_dept_age',
               'index': ['department', 'age']
           }
       ]
) }}
```

dbt-clickhouse автоматически генерирует DDL с учётом версии:

| Версия ClickHouse | Сгенерированный SQL |
| - | - |
| 26.1+ | `ADD PROJECTION proj_by_age INDEX age TYPE basic` |
| 25.8 – 26.0 | `ADD PROJECTION proj_by_age (SELECT _part_offset ORDER BY age)` |

<h2 id="materialization-incremental">
  Материализация: инкрементальная
</h2>

Модель типа table будет пересоздаваться при каждом запуске dbt. Это может оказаться непрактичным и чрезвычайно затратным для больших результирующих наборов или сложных преобразований. Чтобы решить эту проблему и сократить время сборки, модель dbt можно создать как инкрементальную таблицу ClickHouse и настроить с помощью следующего синтаксиса:

Определение модели в `dbt_project.yml`:

```yaml theme={null}
models:
  <resource-path>:
    +materialized: incremental
    +order_by: [ <column-name>, ... ]
    +engine: <engine-type>
    +partition_by: [ <column-name>, ... ]
    +unique_key: [ <column-name>, ... ]
    +inserts_only: [ True|False ]
```

Или блок `config` в `models/<model_name>.sql`:

```python theme={null}
{{ config(
    materialized = "incremental",
    engine = "<engine-type>",
    order_by = [ "<column-name>", ... ],
    partition_by = [ "<column-name>", ... ],
    unique_key = [ "<column-name>", ... ],
    inserts_only = [ True|False ],
      ...
    ]
) }}
```

<h3 id="incremental-configurations">
  Конфигурации
</h3>

Ниже перечислены конфигурации, характерные для этого типа материализации:

| Параметр | Описание | Обязательно? |
| - | - | - |
| `unique_key` | Кортеж имён столбцов, которые однозначно идентифицируют строки. Подробнее об ограничениях уникальности см. [здесь](https://docs.getdbt.com/docs/build/incremental-models#defining-a-unique-key-optional). | Обязательно. Если не указать, изменённые строки будут дважды добавлены в инкрементальную таблицу. |
| `inserts_only` | Этот параметр устарел в пользу инкрементальной `strategy` `append`, которая работает аналогичным образом. Если для инкрементальной модели задано значение True, инкрементальные обновления будут вставляться напрямую в целевую таблицу без создания промежуточной таблицы. Если задан `inserts_only`, `incremental_strategy` игнорируется. | Необязательно (по умолчанию: `False`) |
| `incremental_strategy` | Стратегия, используемая для инкрементальной материализации. Поддерживаются `delete+insert`, `append`, `insert_overwrite` и `microbatch`. Дополнительные сведения о стратегиях см. [здесь](#incremental-model-strategies) | Необязательно (по умолчанию: 'default') |
| `incremental_predicates` | Дополнительные условия, применяемые к инкрементальной материализации (только для стратегии `delete+insert` | Необязательно |

<h3 id="incremental-model-strategies">
  Стратегии инкрементальных моделей
</h3>

`dbt-clickhouse` поддерживает следующие стратегии для инкрементальных моделей.

<h4 id="default-legacy-strategy">
  Стратегия по умолчанию (устаревшая)
</h4>

Исторически ClickHouse поддерживал обновления и удаления лишь ограниченно — в виде асинхронных «мутаций».
Чтобы эмулировать ожидаемое поведение dbt,
dbt-clickhouse по умолчанию создает новую временную таблицу, содержащую все незатронутые (не удаленные и не измененные) «старые»
записи, а также все новые или обновленные записи,
а затем меняет местами или выполняет EXCHANGE этой временной таблицы с существующим отношением инкрементальной модели. Это единственная стратегия,
которая сохраняет исходное отношение, если что-то
пойдет не так до завершения операции; однако, поскольку она требует полного копирования исходной таблицы, ее выполнение может быть довольно
дорогим и медленным.

<h4 id="delete-insert-strategy">
  Стратегия Delete+Insert
</h4>

Стратегия `delete+insert` использует [легковесное удаление](/ru/concepts/features/operations/delete/lightweight-delete), чтобы удалить затронутые строки, а затем вставить новые. Поскольку она не копирует всю таблицу, её производительность значительно выше, чем у стратегии «legacy». Если в профиле задать `use_lw_deletes: true`, `delete+insert` станет инкрементальной стратегией по умолчанию.

При использовании этой стратегии следует учитывать несколько важных ограничений:

* Она работает непосредственно с затронутой таблицей, не создавая промежуточных или временных таблиц, поэтому при возникновении
  проблемы во время операции данные в инкрементальной модели, скорее всего, окажутся в некорректном состоянии.
* Для неё требуется настройка ClickHouse `allow_nondeterministic_mutations`. Адаптер автоматически включает её в своих
  сеансах, когда это возможно. Если включить её нельзя (например, она доступна пользователю dbt только для чтения), поведение
  зависит от способа выбора стратегии: модели, использующие стратегию по умолчанию, незаметно переключаются на стратегию legacy,
  модели, в которых явно задана `delete+insert` или `microbatch`, завершаются ошибкой во время выполнения, а `use_lw_deletes: true` в
  профиле вызывает ошибку при подключении.
* В некоторых крайне редких случаях использование недетерминированных `incremental_predicates` может привести к состоянию гонки для
  обновляемых или удаляемых элементов. Чтобы обеспечить согласованные результаты, инкрементальные предикаты должны включать только подзапросы к
  данным, которые не будут изменяться во время инкрементальной материализации.

<h4 id="microbatch-strategy">
  Стратегия Microbatch (требуется dbt-core >= 1.9)
</h4>

Инкрементальная стратегия `microbatch` доступна в dbt-core начиная с версии 1.9 и предназначена для эффективной обработки масштабных преобразований временных рядов. В dbt-clickhouse она основана на существующей инкрементальной стратегии `delete_insert`, разбивая инкрементальную обработку на заранее определённые батчи временных рядов на основе конфигураций модели `event_time` и `batch_size`.

Помимо обработки масштабных преобразований, Microbatch позволяет:

* [Повторно обрабатывать неуспешные батчи](https://docs.getdbt.com/docs/build/incremental-microbatch#retry).
* Автоматически определять [параллельное выполнение батчей](https://docs.getdbt.com/docs/build/parallel-batch-execution).
* Избавиться от необходимости в сложной условной логике при [дозагрузке](https://docs.getdbt.com/docs/build/incremental-microbatch#backfills).

Подробные сведения об использовании Microbatch см. в [официальной документации](https://docs.getdbt.com/docs/build/incremental-microbatch).

<h5 id="available-microbatch-configurations">
  Доступные конфигурации Microbatch
</h5>

| Option | Description | Default if any |
| - | - | - |
| event\_time | Столбец, указывающий, «в какое время произошла строка». Обязателен для вашей модели Microbatch и всех непосредственных родительских моделей, к которым должна применяться фильтрация. | |
| begin | «Начало времён» для модели Microbatch. Это отправная точка для любых первоначальных или full-refresh сборок. Например, если ежедневная модель Microbatch запущена 2024-10-01 с `begin = '2023-10-01'`, будет обработано 366 батчей (это високосный год!) плюс батч за «сегодня». | |
| batch\_size | Гранулярность батчей. Поддерживаемые значения: `hour`, `day`, `month` и `year` | |
| lookback | Обрабатывает X батчей перед последней закладкой, чтобы захватить записи, поступившие с задержкой. | 1 |
| concurrent\_batches | Переопределяет автоматически определённое dbt поведение для параллельного выполнения батчей. Подробнее см. [настройку concurrent batches](https://docs.getdbt.com/docs/build/incremental-microbatch#configure-concurrent_batches). Значение true запускает батчи параллельно (одновременно), а false — последовательно (один за другим). | |

<h4 id="append-strategy">
  Стратегия Append
</h4>

Эта стратегия заменяет настройку `inserts_only` в предыдущих версиях dbt-clickhouse. При таком подходе новые строки просто добавляются
в существующее отношение.
В результате дубликаты строк не удаляются, и временная или промежуточная таблица не используется. Это самый быстрый
подход, если дубликаты либо допустимы
в данных, либо исключаются предложением WHERE/фильтром в инкрементальном запросе.

<h4 id="insert-overwrite-strategy">
  Стратегия insert\_overwrite (экспериментальная)
</h4>

> \[IMPORTANT]
> В настоящее время стратегия insert\_overwrite не полностью поддерживается для распределённых материализаций.

Выполняет следующие шаги:

1. Создаёт staging-таблицу (временную) с той же структурой, что и отношение инкрементальной модели:
   `CREATE TABLE <staging> AS <target>`.
2. Выполняет вставку только новых записей (созданных `SELECT`) в staging-таблицу.
3. Заменяет в целевой таблице только новые партиции (присутствующие в staging-таблице).

У этого подхода есть следующие преимущества:

* Он быстрее стратегии по умолчанию, потому что не копирует таблицу целиком.
* Он безопаснее других стратегий, потому что не изменяет исходную таблицу, пока операция INSERT не завершится
  успешно: в случае сбоя на промежуточном этапе исходная таблица не изменяется.
* Он реализует лучшую практику data engineering — «неизменяемость партиций». Это упрощает инкрементальную и параллельную
  обработку данных, откаты и т. д.

Для этой стратегии в конфигурации модели должен быть задан `partition_by`. Все остальные параметры config модели,
специфичные для стратегии, игнорируются.

<h2 id="materialized-view">
  Материализация: materialized\_view
</h2>

Материализация `materialized_view` создаёт в ClickHouse [materialized view](/ru/reference/statements/create/view#materialized-view), который служит триггером вставки: он автоматически преобразует и вставляет новые строки из исходной таблицы в целевую таблицу. Это одна из самых мощных материализаций в dbt-clickhouse.

Из-за объёма материала эта материализация вынесена на отдельную страницу. **[Перейдите к руководству по Materialized Views](/ru/integrations/connectors/data-ingestion/etl-tools/dbt/materialization-materialized-view)**, чтобы ознакомиться с полной документацией

<h2 id="materialization-dictionary">
  Материализация: словарь (экспериментальный)
</h2>

Модель dbt можно создать в виде [словаря](/ru/concepts/features/dictionaries/index) ClickHouse. При каждом запуске `dbt run` словарь заменяется текущим определением модели с помощью `CREATE OR REPLACE DICTIONARY`.

<h3 id="dictionary-configurations">
  Конфигурации
</h3>

| Параметр | Описание | Обязательно |
| - | - | - |
| `fields` | Структура словаря в виде списка пар `(name, type)`. | Да |
| `primary_key` | Первичный ключ словаря. Должен соответствовать типу ключа, ожидаемому выбранной структурой (например, составной ключ для структур `COMPLEX_KEY_*`). | Да |
| `layout` | [Структура](/ru/reference/statements/create/dictionary/layouts/overview), используемая для хранения словаря в памяти, например `HASHED()`, `COMPLEX_KEY_HASHED()` или `DIRECT()`. | Да |
| `source_type` | Источник данных словаря: `clickhouse` (по умолчанию использует SQL модели или параметр `table`) либо `http`. | |
| `lifetime` | Предложение [`LIFETIME`](/ru/reference/statements/create/dictionary/lifetime), определяющее частоту обновления словаря, например `MIN 0 MAX 300`. Необязательно начиная с dbt-clickhouse 1.10.0 — не указывайте его для структур, которые его не используют, например `DIRECT()`. | |
| `table` | Только для источника `clickhouse`. Чтение из существующей таблицы вместо SQL модели. | |
| `update_field` | Только для источника `clickhouse`. Позволяет обновлять словарь инкрементально, получая только строки, значение в этом столбце которых изменилось с момента предыдущего обновления. См. [LIFETIME](/ru/reference/statements/create/dictionary/lifetime). Доступно начиная с dbt-clickhouse 1.10.0. | |
| `update_lag` | Только для источника `clickhouse`. Количество секунд, вычитаемое из времени предыдущего обновления при использовании `update_field`, чтобы учесть обновления, поступившие с задержкой. Доступно начиная с dbt-clickhouse 1.10.0. | |
| `connection_overrides` | Только для источника `clickhouse`. Переопределения учётных данных, используемых в предложении `SOURCE` словаря, например `{'user': 'dictionary_reader'}`. | |
| `url`, `format` | Только для источника `http`. URL исходного файла и его входной формат. | Да для `http` |
| `range` | Предложение `RANGE` для структур `RANGE_HASHED()`, например `'min start max stop'`. | |

<h3 id="dictionary-clickhouse-source-example">
  Пример с источником данных ClickHouse
</h3>

SQL модели становится запросом к источнику словаря:

```sql theme={null}
{{ config(
       materialized='dictionary',
       fields=[
           ('id', 'UInt64'),
           ('name', 'String'),
       ],
       primary_key='id',
       layout='HASHED()',
       lifetime='MIN 0 MAX 300'
) }}

select id, name from {{ source('raw', 'people') }}
```

<h3 id="dictionary-http-source-example">
  Пример с HTTP-источником
</h3>

При использовании `source_type='http'` (или параметра `table`) источником служит не SQL модели, однако dbt по-прежнему требует тело запроса — используйте в качестве заполнителя `select 1`:

```sql theme={null}
{{ config(
       materialized='dictionary',
       fields=[
           ('LocationID', 'UInt16 DEFAULT 0'),
           ('Borough', 'String'),
           ('Zone', 'String'),
       ],
       primary_key='LocationID',
       layout='HASHED()',
       lifetime='MIN 0 MAX 0',
       source_type='http',
       url='https://datasets-documentation.s3.eu-west-3.amazonaws.com/nyc-taxi/taxi_zone_lookup.csv',
       format='CSVWithNames'
) }}

select 1
```

Дополнительные примеры, в том числе словарей с разметкой range и direct, см. в [тестах словарей](https://github.com/ClickHouse/dbt-clickhouse/blob/main/tests/integration/adapter/dictionary/test_dictionary.py).

<h2 id="materialization-distributed-table">
  Материализация: distributed\_table (экспериментальная)
</h2>

distributed таблица создается следующим образом:

1. Создается временное представление с SQL-запросом, чтобы получить нужную структуру
2. Создаются пустые локальные таблицы на основе представления
3. Создается distributed таблица на основе локальных таблиц.
4. Данные вставляются в distributed таблицу и распределяются по сегментам без дублирования.

Примечания:

* Запросы dbt-clickhouse теперь автоматически включают настройку `insert_distributed_sync = 1`, чтобы
  последующие операции
  инкрементальной материализации выполнялись корректно. Из-за этого некоторые вставки в distributed таблицу могут выполняться медленнее,
  чем ожидалось.

<h3 id="distributed-table-model-example">
  Пример модели для distributed таблицы
</h3>

```sql theme={null}
{{
    config(
        materialized='distributed_table',
        order_by='id, created_at',
        sharding_key='cityHash64(id)',
        engine='ReplacingMergeTree'
    )
}}

select id, created_at, item
from {{ source('db', 'table') }}
```

<h3 id="distributed-table-generated-migrations">
  Сгенерированные миграции
</h3>

```sql theme={null}
CREATE TABLE db.table_local on cluster cluster (
    `id` UInt64,
    `created_at` DateTime,
    `item` String
)
    ENGINE = ReplacingMergeTree
    ORDER BY (id, created_at);

CREATE TABLE db.table on cluster cluster (
    `id` UInt64,
    `created_at` DateTime,
    `item` String
)
    ENGINE = Distributed ('cluster', 'db', 'table_local', cityHash64(id));
```

<h3 id="distributed-table-configurations">
  Конфигурации
</h3>

Ниже перечислены конфигурации, специфичные для этого типа материализации:

| Параметр | Описание | Значение по умолчанию, если есть |
| - | - | - |
| sharding\_key | Ключ сегментирования определяет сервер назначения при вставке в таблицу с движком Distributed. Ключ сегментирования может быть случайным или представлять собой результат работы хеш-функции | `rand()`) |

<h2 id="materialization-distributed-incremental">
  материализация: distributed\_incremental (экспериментальная)
</h2>

Инкрементальная модель, основанная на той же идее, что и distributed таблица; основная сложность заключается в корректной обработке всех инкрементальных
стратегий.

1. *Стратегия Append* просто выполняет вставку данных в distributed таблицу.
2. *Стратегия Delete+Insert* создает временную distributed таблицу для работы со всеми данными на каждом сегменте.
3. *Стратегия Default (Legacy)* создает временную и промежуточную distributed таблицы по той же причине.

Заменяются только таблицы сегментов, поскольку distributed таблица не хранит данные.
Distributed таблица перезагружается только при включенном режиме full\_refresh или если структура таблицы могла измениться.

<h3 id="distributed-incremental-model-example">
  Пример инкрементальной модели Distributed
</h3>

```sql theme={null}
{{
    config(
        materialized='distributed_incremental',
        engine='MergeTree',
        incremental_strategy='append',
        unique_key='id,created_at'
    )
}}

select id, created_at, item
from {{ source('db', 'table') }}
```

<h3 id="distributed-incremental-generated-migrations">
  Созданные миграции
</h3>

```sql theme={null}
CREATE TABLE db.table_local on cluster cluster (
    `id` UInt64,
    `created_at` DateTime,
    `item` String
)
    ENGINE = MergeTree;

CREATE TABLE db.table on cluster cluster (
    `id` UInt64,
    `created_at` DateTime,
    `item` String
)
    ENGINE = Distributed ('cluster', 'db', 'table_local', cityHash64(id));
```

<h2 id="snapshot">
  Snapshot
</h2>

Снимки dbt ([snapshots](https://docs.getdbt.com/docs/build/snapshots)) фиксируют, как строки изменяемой модели меняются со временем, в виде [медленно меняющихся измерений типа 2](https://en.wikipedia.org/wiki/Slowly_changing_dimension#Type_2:_add_new_row), благодаря чему аналитики могут "заглянуть в прошлое" и увидеть предыдущее состояние модели. Адаптер ClickHouse поддерживает как стратегию `timestamp`, так и `check`. Каждую новую версию таблицы снимка он строит в staging-таблице и подставляет её с помощью `EXCHANGE TABLES` (или через drop и rename, если сервер не поддерживает обмен таблицами), поэтому считыватели всегда видят целостную версию снимка.

Начиная с dbt 1.9 снимки определяются в YAML, в файле `snapshots/<name>.yml`:

```yaml theme={null}
snapshots:
  - name: <snapshot-name>
    relation: ref('<model-name>')
    config:
      unique_key: <column-name>
      strategy: timestamp             # or check
      updated_at: <column-name>       # timestamp strategy
      # check_cols: [<column-name>, ...]  # check strategy
```

Прежняя форма Jinja в `snapshots/<name>.sql` продолжает работать:

```python theme={null}
{% snapshot <snapshot-name> %}
{{
   config(
     unique_key = "<column-name>",
     strategy = "<strategy>",
     updated_at = "<updated-at-column-name>",
   )
}}
select * from {{ ref('<model-name>') }}
{% endsnapshot %}
```

Подробный пример на основе Jaffle Shop приведён в [разделе о снимках в руководствах](/ru/integrations/connectors/data-ingestion/etl-tools/dbt/guides#snapshot). Полный список параметров см. на справочной странице [snapshot configs](https://docs.getdbt.com/docs/build/snapshots#snapshot-configs).

<h2 id="contracts-and-constraints">
  Контракты и ограничения
</h2>

Поддерживаются только контракты, в которых типы столбцов должны точно совпадать. Например, контракт с типом столбца UInt32 завершится ошибкой, если модель
возвращает UInt64 или другой целочисленный тип.
ClickHouse также поддерживает *только* ограничения `CHECK` для всей таблицы/модели. Первичный ключ, внешний ключ, уникальные ограничения и
ограничения `CHECK` на уровне столбца не поддерживаются.
(См. документацию ClickHouse о первичных ключах и ключах ORDER BY.)
