# Настройки IBM Db2

## Требования к экземпляру

Для использования IBM Db2 с адаптером `ibm-dbt-db2` убедитесь, что к экземпляру подключена база данных, которая поддерживает создание, переименование, изменение и удаление таких объектов, как таблицы и представления. Пользователь, подключающийся к экземпляру через адаптер `ibm-dbt-db2`, должен иметь необходимые права доступа к целевой базе данных и схеме.

Подробнее см. в официальной [документации IBM Db2](https://www.ibm.com/docs/en/db2)

## Поддерживаемые платформы Db2

Адаптер `ibm-dbt-db2` поддерживает следующие платформы IBM Db2:

* **Db2 for Linux, Unix, and Windows (LUW)** — версия 9.7 и выше
* **Db2 for z/OS** — версия 11 и выше
* **Db2 for iSeries** — совместимые версии

## Seed-файлы и типы данных

Адаптер `ibm-dbt-db2` обеспечивает полную поддержку всех типов данных Db2 в seed-файлах. Чтобы воспользоваться этой возможностью, необходимо явно определить тип данных каждого столбца в конфигурации seed.

Типы данных столбцов можно настроить в файле `dbt_project.yml` или в файлах свойств — dbt поддерживает оба варианта. Подробнее о настройке seed и рекомендуемых подходах см. в [документации по настройке seed в dbt](https://docs.getdbt.tech/reference/seed-configs.md).

### Пример настройки seed

В файле `dbt_project.yml`:

```yaml
seeds:
  my_project:
    raw_customers:
      +column_types:
        id: INTEGER
        name: VARCHAR(100)
        email: VARCHAR(255)
        created_at: TIMESTAMP
        is_active: BOOLEAN
```

### Поддерживаемые типы данных Db2

| Тип данных Db2 | Описание                                         | Пример использования            |
| -------------- | ------------------------------------------------ | ------------------------------- |
| INTEGER        | 32-битное целое число                            | `id: INTEGER`                   |
| BIGINT         | 64-битное целое число                            | `large_id: BIGINT`              |
| SMALLINT       | 16-битное целое число                            | `status_code: SMALLINT`         |
| DECIMAL(p,s)   | Десятичное число с фиксированной точкой          | `price: DECIMAL(10,2)`          |
| FLOAT          | Число с плавающей точкой                         | `rate: FLOAT`                   |
| DOUBLE         | Число с плавающей точкой двойной точности        | `measurement: DOUBLE`           |
| VARCHAR(n)     | Строка переменной длины                          | `name: VARCHAR(100)`            |
| CHAR(n)        | Строка фиксированной длины                       | `code: CHAR(10)`                |
| CLOB           | Большой символьный объект                        | `description: CLOB`             |
| BLOB           | Большой двоичный объект                          | `image_data: BLOB`              |
| DATE           | Значение даты                                    | `birth_date: DATE`              |
| TIME           | Значение времени                                 | `start_time: TIME`              |
| TIMESTAMP      | Дата и время                                     | `created_at: TIMESTAMP`         |
| BOOLEAN        | Логическое значение                              | `is_active: BOOLEAN`            |
| XML            | XML-документ                                     | `config: XML`                   |
| GRAPHIC(n)     | Строка двухбайтовых символов фиксированной длины | `unicode_text: GRAPHIC(50)`     |
| VARGRAPHIC(n)  | Строка двухбайтовых символов переменной длины    | `unicode_name: VARGRAPHIC(100)` |
| DBCLOB         | Большой объект с двухбайтовыми символами         | `large_unicode: DBCLOB`         |

## Стратегии материализации

Адаптер `ibm-dbt-db2` поддерживает все стандартные материализации dbt:

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

Создаёт физическую таблицу в базе данных. Эта материализация используется по умолчанию, если не указана другая.

```sql
{{ config(materialized='table') }}

SELECT * FROM source_table
```

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

Создаёт представление в базе данных. Представления — это виртуальные таблицы, которые не хранят данные физически.

```sql
{{ config(materialized='view') }}

SELECT * FROM source_table
```

### Инкрементальная материализация

Формирует таблицы инкрементально, обрабатывая только новые или изменённые записи. Адаптер `ibm-dbt-db2` поддерживает две инкрементальные стратегии:

#### Стратегия merge (по умолчанию)

Использует оператор MERGE в Db2 для эффективного выполнения вставок и обновлений:

```sql
{{
  config(
    materialized='incremental',
    unique_key='id',
    incremental_strategy='merge'
  )
}}

SELECT * FROM source_table
{% if is_incremental() %}
WHERE updated_at > (SELECT MAX(updated_at) FROM {{ this }})
{% endif %}
```

#### Стратегия delete+insert

Удаляет совпадающие записи, затем вставляет новые:

```sql
{{
  config(
    materialized='incremental',
    unique_key='id',
    incremental_strategy='delete+insert'
  )
}}

SELECT * FROM source_table
{% if is_incremental() %}
WHERE updated_at > (SELECT MAX(updated_at) FROM {{ this }})
{% endif %}
```

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

Создаёт общее табличное выражение (CTE), которое существует только в течение одного запуска dbt:

```sql
{{ config(materialized='ephemeral') }}

SELECT * FROM source_table
```

## Снимки

Адаптер `ibm-dbt-db2` поддерживает снимки dbt для отслеживания медленно изменяющихся измерений (SCD типа 2). Снимки фиксируют состояние данных в разные моменты времени.

Пример снимка:

```sql
{% snapshot customers_snapshot %}

{{
  config(
    target_schema='snapshots',
    unique_key='id',
    strategy='timestamp',
    updated_at='updated_at'
  )
}}

SELECT * FROM {{ source('raw', 'customers') }}

{% endsnapshot %}
```

## Ограничения

Адаптер `ibm-dbt-db2` поддерживает определение ограничений в моделях, но степень обеспечения их соблюдения различается:

| Тип ограничения | Уровень поддержки               | Примечания                                                    |
| --------------- | ------------------------------- | ------------------------------------------------------------- |
| NOT NULL        | ✅ Соблюдение обеспечивается    | Полностью поддерживается, соблюдение обеспечивается Db2       |
| CHECK           | ⚠️ Соблюдение не обеспечивается | Определяется, но соблюдение не обеспечивается в контексте dbt |
| UNIQUE          | ⚠️ Соблюдение не обеспечивается | Определяется, но соблюдение не обеспечивается в контексте dbt |
| PRIMARY KEY     | ⚠️ Соблюдение не обеспечивается | Определяется, но соблюдение не обеспечивается в контексте dbt |
| FOREIGN KEY     | ⚠️ Соблюдение не обеспечивается | Определяется, но соблюдение не обеспечивается в контексте dbt |

Пример с ограничениями:

```sql
{{
  config(
    materialized='table'
  )
}}

SELECT
  id,
  name,
  email,
  created_at
FROM source_table
```

Определите ограничения в YAML-файле схемы:

```yaml
models:
  - name: customers
    columns:
      - name: id
        constraints:
          - type: not_null
          - type: primary_key
      - name: email
        constraints:
          - type: not_null
```

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

### Индексирование

Хотя dbt не управляет индексами напрямую, их можно создавать с помощью post-hook:

```sql
{{
  config(
    materialized='table',
    post_hook=[
      "CREATE INDEX idx_customer_email ON {{ this }} (email)",
      "CREATE INDEX idx_customer_created ON {{ this }} (created_at)"
    ]
  )
}}

SELECT * FROM source_table
```

### Организация таблиц

Db2 поддерживает различные типы организации таблиц. Их можно задать с помощью post-hook:

```sql
{{
  config(
    materialized='table',
    post_hook=[
      "ALTER TABLE {{ this }} ORGANIZE BY ROW"
    ]
  )
}}

SELECT * FROM source_table
```

## Управление правами доступа

Адаптер `ibm-dbt-db2` поддерживает управление правами доступа к объектам базы данных:

```sql
{{
  config(
    materialized='table',
    grants={
      'select': ['reporting_role', 'analyst_user'],
      'insert': ['etl_role'],
      'update': ['etl_role']
    }
  )
}}

SELECT * FROM source_table
```

## Чувствительность к регистру

По умолчанию Db2 переводит идентификаторы без кавычек в верхний регистр. Адаптер обрабатывает это автоматически, но учитывайте следующее:

* Имена таблиц и столбцов без кавычек будут переведены в верхний регистр
* Используйте двойные кавычки для сохранения регистра: `"MyTable"` в отличие от `MYTABLE`
* Адаптер автоматически выполняет преобразование регистра при операциях dbt

## Рекомендации

* **Изучайте документацию SQL**: ознакомьтесь со [справочником SQL](https://www.ibm.com/docs/en/db2) IBM Db2, чтобы понимать особенности и ограничения платформы.
* **Используйте инкрементальные модели**: для больших наборов данных используйте инкрементальную материализацию со стратегией `merge`, чтобы обеспечить оптимальную производительность.
* **Явно задавайте типы данных**: всегда явно определяйте типы данных в конфигурациях seed, чтобы обеспечить корректную загрузку данных.
* **Используйте пул соединений**: задавайте подходящее количество потоков в профиле, чтобы сбалансировать параллелизм и накладные расходы на соединения.
* **Используйте SSL/TLS в производственной среде**: включите защиту SSL/TLS для производственных баз данных, чтобы защитить данные при передаче.
* **Отслеживайте производительность**: используйте встроенные средства мониторинга Db2 для отслеживания производительности запросов и оптимизации моделей.
* **Тестируйте инкрементальные модели**: при разработке инкрементальных моделей тестируйте их на небольших выборках данных, прежде чем запускать на полных наборах данных.
