# Конфигурации Exasol

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

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

* `append` (по умолчанию, если `unique_key` не задан)
* `merge`
* `delete+insert` (по умолчанию, если `unique_key` задан)
* [`microbatch`](https://docs.getdbt.tech/docs/build/incremental-microbatch.md)

Все эти стратегии унаследованы от dbt. Дополнительную информацию об инкрементальных стратегиях см. в [документации по инкрементальным стратегиям](https://docs.getdbt.tech/docs/build/incremental-strategy.md).

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

### Распределение и секционирование таблиц

Начиная с dbt-exasol 1.8.1, вы можете настраивать стратегии распределения и секционирования таблиц для оптимизации производительности запросов в Exasol. Эти настройки доступны для моделей с материализацией `table` или `incremental`.

Exasol поддерживает следующие настройки оптимизации производительности:

| Параметр               | Тип                         | Обязательный | Описание                                                                             |
| ---------------------- | --------------------------- | ------------ | ------------------------------------------------------------------------------------ |
| `partition_by_config`  | `<string>` или `[<string>]` | нет          | Секционирует таблицу по указанным столбцам для повышения производительности запросов |
| `distribute_by_config` | `<string>`                  | нет          | Распределяет данные по узлам кластера по указанному столбцу                          |
| `primary_key_config`   | `[<string>]`                | нет          | Определяет ограничения первичного ключа                                              |

### YAML-файл проекта

dbt\_project.yml

```yaml
models:
  <resource-path>:
    +materialized: table
    +partition_by_config: <column-name>
    +distribute_by_config: <column-name>
    +primary_key_config: [<column-name>]
```

### YAML-файл свойств

models/properties.yml

```yaml
models:
  - name: [<model-name>]
    config:
      materialized: table
      partition_by_config: <column-name>
      distribute_by_config: <column-name>
      primary_key_config: [<column-name>]
```

### Конфигурация в SQL-файле

models/\<model\_name>.sql

```jinja
{{ config(
    materialized="table",
    partition_by_config="<column-name>",
    distribute_by_config="<column-name>",
    primary_key_config=["<column-name>"]
) }}
```

#### Пример с одним столбцом

Следующий пример создаёт таблицу, секционированную по `order_date`, с распределением по `customer_id` и первичным ключом по `customer_id`:

models/orders.sql

```sql
{{
    config(
        materialized='table',
        primary_key_config=['customer_id'],
        partition_by_config='order_date',
        distribute_by_config='customer_id'
    )
}}

select
    customer_id,
    order_date,
    order_total,
    order_status
from {{ source('sales', 'orders') }}
```

#### Пример с несколькими столбцами

При настройке нескольких столбцов для `primary_key_config` укажите их в виде списка:

models/order\_items.sql

```sql
{{
    config(
        materialized='incremental',
        primary_key_config=['order_id', 'item_id'],
        partition_by_config='order_date',
        distribute_by_config='order_id',
        unique_key=['order_id', 'item_id']
    )
}}

select
    order_id,
    item_id,
    order_date,
    quantity,
    price
from {{ source('sales', 'order_items') }}
```

к сведению

При настройке нескольких столбцов для `primary_key_config` всегда указывайте их в виде списка: `['column1', 'column2']`

Дополнительную информацию о распределении и секционировании таблиц в Exasol см. в [документации Exasol](https://docs.exasol.com/db/latest/sql/create_table.htm).

## Контракты моделей

Exasol поддерживает [контракты моделей](https://docs.getdbt.tech/docs/mesh/govern/model-contracts.md) со следующими ограничениями базы данных:

| Тип ограничения | Статус поддержки     | Описание                                              |
| --------------- | -------------------- | ----------------------------------------------------- |
| `not_null`      | ✅ Применяется       | Запрещает значения NULL в столбце                     |
| `primary_key`   | ✅ Применяется       | Обеспечивает уникальность и NOT NULL                  |
| `foreign_key`   | ✅ Применяется       | Ссылается на первичный ключ другой таблицы            |
| `check`         | ❌ Не поддерживается | Пользовательские выражения проверки не поддерживаются |
| `unique`        | ❌ Не поддерживается | Ограничения уникальности не поддерживаются            |

### Пример с применяемыми ограничениями

models/customers.yml

```yaml
models:
  - name: customers
    config:
      contract:
        enforced: true
    columns:
      - name: customer_id
        data_type: integer
        constraints:
          - type: not_null
          - type: primary_key
      - name: email
        data_type: varchar(255)
        constraints:
          - type: not_null
      - name: country_id
        data_type: integer
        constraints:
          - type: foreign_key
            expression: countries (country_id)
```

Дополнительную информацию о контрактах моделей см. в [документации по контрактам моделей](https://docs.getdbt.tech/docs/mesh/govern/model-contracts.md).

## Формат временных меток

Начиная с dbt-exasol 1.2.2, формат временных меток по умолчанию — `YYYY-MM-DDTHH:MI:SS.FF6`.

Вы можете изменить формат временных меток в [конфигурации профиля](https://docs.getdbt.tech/docs/local/connect-data-platform/exasol-setup.md):

profiles.yml

```yaml
outputs:
  dev:
    type: exasol
    timestamp_format: 'YYYY-MM-DD HH24:MI:SS.FF3'
    # ... другие настройки
```

### Особенности стратегии microbatch

При использовании инкрементальной стратегии [`microbatch`](https://docs.getdbt.tech/docs/build/incremental-microbatch.md) Exasol требует, чтобы временные метки в определениях моделей не содержали суффикса часового пояса:

```sql
-- ✅ Правильно (совместимо с Exasol)
TIMESTAMP '2024-01-01 10:00:00'

-- ❌ Неправильно (вызовет ошибки синтаксического анализа)
TIMESTAMP '2024-01-01 10:00:00-0'
```

Адаптер dbt-exasol автоматически обрабатывает форматирование временных меток для границ микропакетов.

Дополнительную информацию о стратегии microbatch см. в [документации по microbatch](https://docs.getdbt.tech/docs/build/incremental-microbatch.md).

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

Exasol не поддерживает материализованные представления. При попытке использовать `materialized='materialized_view'` операция завершится с ошибкой.

### Обходные решения

* Используйте `materialized='table'` с соответствующей логикой обновления
* Используйте `materialized='incremental'` с подходящими [инкрементальными стратегиями](https://docs.getdbt.tech/docs/build/incremental-strategy.md)

## Операции клонирования

Exasol не поддерживает операции клонирования таблиц. Это влияет на возможности dbt, которые зависят от функциональности `CLONE`.

## Ограничения модульного тестирования

В Exasol существуют определённые ограничения для [модульных тестов](https://docs.getdbt.tech/docs/build/unit-tests.md):

### Обработка пустых строк

В Exasol пустые строки обрабатываются как `NULL`. Это влияет на тестовые фикстуры, использующие пустые строковые литералы для имитации пустых значений. При написании модульных тестов с seed-данными учитывайте следующее:

```yaml
# Эти seed-данные
id,name,value
1,test,""  # Пустая строка

# Будут интерпретированы как
id,name,value
1,test,NULL  # Значение NULL в Exasol
```

### Тестирование с использованием разных баз данных

Модульные тесты, использующие источники из базы данных, отличной от базы данных моделей, не поддерживаются. Все тестовые фикстуры и модели должны находиться в одной базе данных.

### Агрегатные функции в CTE

Exasol не поддерживает некоторые агрегатные функции (`LISTAGG`, `MEDIAN`, `PERCENTILE_CONT`) при их использовании внутри общих табличных выражений (CTE), созданных на основе фикстур модульных тестов dbt. Для этих функций требуются таблицы, созданные пользователем.

**Обходное решение:** При тестировании моделей с этими функциями создавайте реальные таблицы для тестовых фикстур вместо использования встроенных CTE.

Если вы заинтересованы в поддержке материализованных тестовых фикстур, приглашаем вас принять участие в обсуждении этой задачи на GitHub: [dbt-labs/dbt#8499](https://github.com/dbt-labs/dbt/issues/8499)

## Настройка подключения

Информацию о параметрах подключения, таких как шифрование, проверка SSL/TLS, аутентификация OpenID и другие настройки профиля, см. в [документации по настройке Exasol](https://docs.getdbt.tech/docs/local/connect-data-platform/exasol-setup.md).
