# クエリ非相関化 ## 定義 クエリ非相関化(Query Decorrelation)とは、相関サブクエリ(外側クエリの列を参照するサブクエリ)を、行ごとのネストループ的評価を必要としない通常のJOINへ書き換える最適化である。相関サブクエリは初期プランではDEPENDENT_JOIN演算子(⧑)で表現される。左枝(外側クエリのプラン)の各行に対し右枝(外側の行変数への自由参照を含むサブクエリのプラン)を評価する構造だが、[[DuckDB]]は物理演算子としてDEPENDENT_JOINを実装しない。そのためNeumann & Kemper(BTW 2015, "Unnesting Arbitrary Queries")の系統的書き換え規則により、π(射影)・Γ(集約)・σ(選択)を経由してDEPENDENT_JOINをプラン下流へ段階的に押し込み、書き換え規則「dがQに自由出現しなければ D ⧑^d Q ≡ D ⋈ Q」が適用可能になった時点で通常のJOINへ置換する。この非相関化はDuckDBにおいて必須の最適化として組み込まれている(Source: [[@2026__DiDi__Query Rewriting and Optimization]], p.26-33)。 ## 横断的知見 - 今後の取り込みで、複数ソース間の関係を追記する。 ## 未解決の問い - Neumann & Kemper(BTW 2015)の書き換え規則はπ・Γ・σを経由する押し下げを扱うが、他の演算子(ORDER BY・LIMIT・WINDOW関数)を含む相関サブクエリの非相関化はどう扱われるか。 - 非相関化後に生成されたJOINは、結合順序最適化(DPhyp)パスの対象になるのか、それとも非相関化パス内で結合順序も同時に決定されるのか。両パスの実行順序(p.06の一覧表での相対位置)を確認する必要がある。 - 非相関化できない(規則が適用不能な)相関サブクエリのクラスは存在するか。存在する場合、DuckDBはフォールバックとしてどう実行するか。 ## 関連 - ソース: [[@2026__DiDi__Query Rewriting and Optimization]] - 概念: [[クエリオプティマイザ]] / [[結合順序最適化]] - エンティティ: [[DuckDB]] / [[Torsten Grust]] / [[Universität Tübingen]] ## 出典 - [[@2026__DiDi__Query Rewriting and Optimization]](DEPENDENT_JOIN演算子とNeumann & Kemperの書き換え規則によるクエリ非相関化の一次ソース、p.25-33)