dbt v1.9の新機能まとめ

# dbt1.9の内容まとめ

https://docs.getdbt.com/docs/dbt-versions/core-upgrade/upgrading-to-v1.9
### 新機能と変更点

#### 1. マイクロバッチ (`microbatch incremental_strategy`)

**概要:**
incremental_strategyにマイクロバッチが追加。従来の方法では全データを一度に処理するため、パフォーマンスに問題が発生することがあったが、マイクロバッチではデータを小さなバッチに分けて処理することで、この問題を解消できるようになった

**コード例**
```sql
{{ config(
    materialized='incremental',
    incremental_strategy='microbatch',
    unique_key='sales_id',
    event_time='transaction_date',
    begin='2023-01-01',
    batch_size='day',
    concurrent_batches=true,
    lookback=3
) }}

select
    sales_id,
    transaction_date,
    customer_id,
    product_id,
    total_amount
from {{ source('sales', 'transactions') }}
```

**主な機能:**
- **クエリ設計の簡素化:** モデルクエリをバッチ単位で書くだけで、`event_time`、`lookback`、`batch_size` に基づいて自動でフィルタを生成
- **独立したバッチ処理:** 指定した `batch_size` に基づきデータを自動分割。各バッチは独立して処理されるため、効率が上がりクエリタイムアウトのリスクが減少。失敗したバッチのみをリトライできる
- **ターゲット再処理:** CLI 引数 `--event-time-start` と `--event-time-end` を使って、特定のバッチをロードすることが可能になった
    ```
    dbt run --event-time-start "2024-09-01" --event-time-end "2024-09-04"
    ```
- **自動並列バッチ実行:** 複数のバッチを同時に処理。dbt が並列実行可能かを自動検出し、必要に応じて `concurrent_batches` 設定を手動で上書き可能

**対応アダプター:**
- PostgreSQL
- Redshift
- Snowflake
- BigQuery
- Spark
- Databricks

#### 2. スナップショットの改善 (`Snapshots improvements`)

**概要:**
スナップショット機能が強化され、設定がより柔軟で一貫性のあるものに。設定、実行、カスタマイズが簡単に。

```snapshot/schema.yml
snapshots:
  - name: <snapshot_name>
    config:
      hard_deletes: 'ignore' | 'invalidate' | 'new_record'
```
**主な改善点:**
- **新しいスナップショット仕様:**
  - YAML ファイルで設定可能になり、クリーンで一貫性のある設定が実現した
- **`snapshot_meta_column_names` 設定:**
  - 自動追加されるメタフィールド（例: `dbt_valid_from`、`dbt_valid_to`）の名前をカスタマイズ可能
  - メタデータをニーズに合わせて調整できる
- **`target_schema` のオプション化:**
  - `target_schema` を省略すると、現在の環境で定義されたスキーマが使われる
- **標準的なスキーマおよびデータベース設定のサポート:**
  - 他の dbt リソースタイプと一貫性があり、環境ごとのスナップショット保存場所を指定できる
- **`updated_at` データ型の警告:**
  - `updated_at` フィールドが適切なデータ型でない場合に警告が表示される
- **`dbt_valid_to` のカスタムインジケーター設定:**
  - `dbt_valid_to_current` を使って `dbt_valid_to` をカスタムインジケーター（例: 未来の日付）に設定可能
  - デフォルトは `NULL`
- **ハードデリートの管理オプション (`hard_deletes`):**
  - 削除された行の処理方法を制御
  - `ignore`（デフォルト）、`invalidate`、`new_record` が選べる
  - `new_record` を設定すると、削除時に新しいレコードが追加される

:::note
既存のスナップショットを安全に移行する方法は、[Snapshot configuration migration](https://docs.getdbt.com/reference/snapshot-configs#snapshot-configuration-migration) を参照
:::

#### 3. `state:modified` の改善

**概要:**
`state:modified` の動作が向上し、誤検出や見逃しのリスクが減少した

**主な改善点:**
- **環境依存の強化:** プロダクションではテーブル、開発ではビューといった環境ごとに異なるロジックでも誤検出が減るように強化
- **`state_modified_compare_more_unrendered_values` フラグ:** ソース解析中に `unrendered_database` と `unrendered_schema` を保持し、`state:modified` チェック時に環境依存ロジックによる誤検出を減少。デフォルトは無効

#### 4. レガシー動作管理 (`Managing changes to legacy behaviors`)

**概要:**
レガシー動作の変更を管理する新しいフラグが追加。既存の動作を維持しつつ新機能を導入することができる

**主な機能:**
- **新しいフラグの導入:** `dbt_project.yml` でフラグを `True` / `False` に設定し、最近の変更（デフォルトで無効）を有効化、または既存の変更（デフォルトで有効）を無効化
- **具体的なフラグ一覧:**

| フラグ名                                                         | 説明                                                                                           |
|------------------------------------------------------------------|------------------------------------------------------------------------------------------------|
| `state_modified_compare_more_unrendered_values`                | 未レンダリングの設定を保持し、`state:modified` チェック時に比較。                           |
| `skip_nodes_if_on_run_start_fails`                              | `on-run-start` フックが失敗した場合、選択されたすべてのノードをスキップ。                   |
| `require_nested_cumulative_type_params`                         | 累積メトリクスが適切にフォーマットされていない場合にエラー。                                 |
| `require_batched_execution_for_custom_microbatch_strategy`     | カスタムマイクロバッチマクロ使用時にバッチ実行を有効化。                                     |
| `restrict_direct_pg_catalog_access`（Redshift 用）              | Redshift API を使うか、`information_schema` をクエリ。                                       |


#### 5. 各DWH固有の機能の改善

| アダプター | 機能 | 説明 |
| --- | --- | --- |
| **Redshift** | IAM ロール認証のサポート | Redshift への接続に IAM ロールを使用可能。セキュリティと管理が強化。 |
| **Snowflake** | Iceberg テーブルフォーマットのサポート | `table`、`incremental`、`dynamic tables` の3つのマテリアライゼーションで Iceberg フォーマットを利用可能。大規模データの管理が効率化。 |
| **BigQuery** | ・キーボード割り込みでのクエリキャンセル<br>・インクリメンタルモデルによる中間テーブルの自動削除 | ・ 実行中のクエリを Ctrl+C などでキャンセルできる。<br>・インクリメンタルモデルが使う中間テーブルを自動でドロップし、リソースを節約。 |
| **Spark** | ODBC ドライバー接続文字列の上書きサポート | カスタム接続が可能になり、接続の柔軟性が向上。 |



#### 6. Quick hits
- **データ品質の維持:** コントラクトされたモデルを削除、リネーム、無効化すると、バージョン管理されたモデルではエラー、されていないモデルでは警告が出る
- **データテストのドキュメント化:** データテストのドキュメントが自動生成され、管理がしやすくなった。
- **外部キー制約での `ref` と `source` の使用:** 外部キー制約に `ref` と `source` を使えるようになり、データモデル間の関係性が明確に
- **テストの包括・除外が可能なフラグの追加:** `--resource-type` と `--exclude-resource-type` フラグで、データテスト（`test`）やユニットテスト（`unit_test`）を含めたり除外したりできるようになった

---