# Пользовательская стратегия микропакетной обработки

Удалён в v2

Этот флаг удалён в v2. Новое поведение включено всегда. При обновлении удалите этот флаг из `dbt_project.yml`.

| require\_batched\_execution\_for\_custom\_microbatch\_strategy | dbt **Последняя версия v1** | dbt v1 |
| -------------------------------------------------------------- | --------------------------- | ------ |
| Введён                                                         | 2024.11                     | 1.9.0  |
| Стал стандартным (по умолчанию → `true`)                       | 2026.09                     | 1.12.0 |
| Удалён                                                         | —                           | v2.0   |

<br />

Флаг `require_batched_execution_for_custom_microbatch_strategy` имеет значение только в том случае, если в вашем проекте уже есть пользовательский макрос `get_incremental_microbatch_sql`. Если пользовательского макроса микропакетной обработки нет, задавать этот флаг не нужно — dbt автоматически выполняет микропакетную обработку для любой модели, использующей [стратегию микропакетной обработки](https://docs.getdbt.tech/docs/build/incremental-microbatch.md#how-microbatch-compares-to-other-incremental-strategies).

Начиная с dbt v1.12, значение этого флага по умолчанию — `true`: dbt выполняет пользовательские стратегии микропакетной обработки пакетами. Если у вас есть пользовательский макрос микропакетной обработки и флаг установлен в `false`, dbt выдаёт предупреждение об устаревшем поведении.

Ранее пользователям требовалось устанавливать переменную окружения `DBT_EXPERIMENTAL_MICROBATCH` в `true`, чтобы предотвратить нежелательное взаимодействие с существующими пользовательскими инкрементальными стратегиями. Теперь значение `DBT_EXPERIMENTAL_MICROBATCH` никак не влияет на поведение во время выполнения.

## Влияние

Этот флаг имеет значение только в том случае, если в вашем проекте есть пользовательский макрос `get_incremental_microbatch_sql`. На проекты без пользовательского макроса микропакетной обработки он не влияет — встроенный макрос уже выполняется пакетами.

Если вы переопределили `get_incremental_microbatch_sql` — обычно для обхода ограничений адаптера или реализации пользовательской стратегии партиционирования, — ваш макрос вызывается в режиме пакетного выполнения, на который он изначально не был рассчитан. Возможные последствия:

* Макрос игнорирует более узкое окно `event_time_start` / `event_time_end` и повторно обрабатывает весь диапазон для каждого пакета, что приводит к лишним вычислениям, дублированию строк или конфликтам `MERGE`/`INSERT`.
* Макрос завершается с ошибкой, поскольку рассчитан на однократный вызов за запуск.
* Количество строк в целевой таблице различается в зависимости от значения флага.

 Рекомендуемые действия

Если модель микропакетной обработки завершается с ошибкой в ходе выполнения, создаёт дублирующиеся строки или конфликты `MERGE`/`INSERT` либо повторно обрабатывает весь диапазон дат для каждого пакета, проверьте, фильтрует ли макрос `get_incremental_microbatch_sql` данные по окну `event_time_start` / `event_time_end`. Если он использует жёстко заданный фильтр по дате (например, `where event_ts >= current_date - interval '1 day'`) или считывает только `_dbt_max_partition`, макрос игнорирует окно отдельного пакета и повторно обрабатывает весь диапазон на каждой итерации.

Чтобы исправить это, перепишите макрос так, чтобы он использовал окно отдельного пакета:

```sql
{% macro get_incremental_microbatch_sql(arg_dict) %}
    {%- set target = arg_dict["target_relation"] -%}
    {%- set source = arg_dict["temp_relation"] -%}
    {%- set event_time = arg_dict["incremental_predicates"] -%}

    -- Используйте окно отдельного пакета, которое dbt передаёт через event_time_start/event_time_end
    -- (доступно через arg_dict["incremental_predicates"] или model.config.event_time_*),
    -- А НЕ жёстко заданный фильтр по дате.
    insert into {{ target }}
    select * from {{ source }}
{% endmacro %}
```

Для проверки выполните `dbt run --event-time-start <date> --event-time-end <date> -s <model>` для одного пакета и убедитесь, что количество строк соответствует данным за этот день.

Чтобы отключить это поведение, установите флаг в `false`:

dbt\_project.yml

```yaml
flags:
  require_batched_execution_for_custom_microbatch_strategy: false
```
