MySQL HeatWave で動作の制限・制約がある SQL 文 (4) インデックスヒント・オプティマイザヒント・結合（JOIN）

こちらの記事の続きです。

- **[MySQL HeatWave で動作の制限・制約がある SQL 文 (3) 関数・オペレータ](https://qiita.com/hmatsu47/items/70084f1cced2e49ad8e0)**

https://qiita.com/hmatsu47/items/70084f1cced2e49ad8e0

以下の 2 ページ分をまとめて紹介します。

- **[2.16.4 Index and Optimizer Hints](https://dev.mysql.com/doc/heatwave/en/mys-hw-limitations-index-optimizer-hints.html)（MySQL HeatWave User Guide）**

https://dev.mysql.com/doc/heatwave/en/mys-hw-limitations-index-optimizer-hints.html

- **[2.16.5 Join Limitations](https://dev.mysql.com/doc/heatwave/en/mys-hw-limitations-joins.html)（MySQL HeatWave User Guide）**

https://dev.mysql.com/doc/heatwave/en/mys-hw-limitations-joins.html

これらについても関数・オペレータと同様、**HeatWave で使えない関数・オペレータが含まれる SQL 文は自動的に MySQL DB 側で実行される** だけの話であり、[こちら](https://qiita.com/hmatsu47/items/5bf7b37f694e56f3dc82#2-time_zone%E3%82%92system0000%E4%BB%A5%E5%A4%96%E3%81%AB%E8%A8%AD%E5%AE%9A%E3%81%97%E3%81%9F%E3%81%A8%E3%81%8D%E3%81%AEtimestamp%E5%88%97update)のようにデータ不整合が生じるおそれもないので、MySQL HeatWave User Guide に記載された内容を翻訳してそのまま列挙します。

:::note warn
2023/9/6 時点（MySQL バージョン 8.1.0-u1-cloud）の情報です。
今後、制限が変わる可能性があります。
:::

## インデックスヒント・オプティマイザヒントの制限

データフォーマットが違うのである意味当然ですが、HeatWave では全般的に使用不可です。

- [インデックスヒント](https://dev.mysql.com/doc/refman/8.0/ja/index-hints.html)・[オプティマイザヒント](https://dev.mysql.com/doc/refman/8.0/ja/optimizer-hints.html)
- `FIRSTMATCH`以外の準結合（セミジョイン）戦略（`DUPSWEEDOUT`）
  - 準結合（セミジョイン）戦略については[こちら](https://dev.mysql.com/doc/refman/8.0/ja/optimizer-hints.html#optimizer-hints-subquery)を参照

## 結合（JOIN）の制限（MySQL DB で実行され HeatWave にオフロードされないもの）

準結合（セミジョイン）・アンチジョインに関する項目が多いです。

**オプティマイザによる変換・最適化によって別のクエリーと同様の実行計画に書き換えられた結果、HeatWave にオフロードされる場合とされない場合がある** 点に注意が必要です。

- 後述する`IN`・`EXISTS`によるものを除くアンチジョイン
- `YEAR`型の他の型への暗黙のキャストによるクエリーキャスト注入
  - **[1.3 MySQL 8.0 の新機能](https://dev.mysql.com/doc/refman/8.0/ja/mysql-nutshell.html)（MySQL 8.0 リファレンスマニュアル）**「クエリーキャスト注入」を参照
- `VARCHAR`型の`DATETIME`・`TIMESTAMP`・`DATE`以外の型への暗黙のキャストによるクエリーキャスト注入
- 日付（時刻・日時）型から数値型への暗黙のキャストによるクエリーキャスト注入
  - 日付（時刻・日時）型を数値型と結合することは不可
- `EXISTS`準結合（セミジョイン）・アンチジョイン
  - 以下を除く
    - `SELECT ... WHERE ... EXISTS (...)`
    - `SELECT ... WHERE ... EXISTS (...) IS TRUE`
    - `SELECT ... WHERE ... EXISTS (...) IS NOT FALSE`
    - `SELECT ... WHERE ... NOT EXISTS (...) IS FALSE`
    - `SELECT ... WHERE ... NOT EXISTS (...) IS NOT TRUE`
  - オプティマイザによる変換・最適化により、`EXISTS`準結合（セミジョイン）・アンチジョインのこれら以外のバリエーションが HeatWave にオフロードされる場合とされない場合がある
- `IN`準結合（セミジョイン）・アンチジョイン
  - 以下を除く
    - `SELECT ... WHERE ... IN (...)`
    - `SELECT ... WHERE ... IN (...) IS TRUE`
    - `SELECT ... WHERE ... NOT IN (...) IS FALSE`
  - `EXISTS`同様、オプティマイザによる変換・最適化により、`IN`準結合（セミジョイン）・アンチジョインのこれら以外のバリエーションが HeatWave にオフロードされる場合とされない場合がある
- 準結合（セミジョイン）およびアンチジョインは、最初の 10,000 個の実行可能な計画を評価した後、または最後の有効な計画から 10,000 個の実行可能な計画を調査した後に見つかった最良の計画を使用する
  - 実行計画の評価に時間が掛かりすぎるのを防止するための制限
- 2 つのテーブルに等号条件が定義されていない外部結合（`OUTER JOIN`）
- `IN ... EXISTS`サブクエリを`ON`句に持つ一部の外部結合（`OUTER JOIN`）

関数・オペレータ以上に静的に解析して対処するのは難しそうな印象です。こちらも実際に SQL 文を流して判断するのが良さそうですね。

---

**2023/9/9 追記：**
続きの記事を書きました。

- **[MySQL HeatWave で動作の制限・制約がある SQL 文 (5) その他](https://qiita.com/hmatsu47/items/4412e043ae74b74fcd70)**

https://qiita.com/hmatsu47/items/4412e043ae74b74fcd70