こちらの記事の続きです。
今回は関数とオペレータの制限です。
HeatWave で使えない関数・オペレータが含まれる SQL 文は自動的に MySQL DB 側で実行される だけの話であり、こちらのようにデータ不整合が生じるおそれもないので、MySQL HeatWave User Guide に記載された内容を翻訳してそのまま列挙します。
- 2.16.3 Functions and Operator Limitations(MySQL HeatWave User Guide)
2023/9/6 時点(MySQL バージョン 8.1.0-u1-cloud)の情報です。
今後、制限が変わる可能性があります。
HeatWave で実行できないもの(MySQL DB で実行され HeatWave にオフロードされないもの)
これらに当てはまる関数・オペレータを含む SQL 文を HeatWave で高速化したい場合は、HeatWave で実行できる内容・形式に書き換える、テーブルに含まれる列のデータ型の定義を変更するなどの対応が必要になります。
- ビット関数と演算子
- 日付(時刻・日時)値に対する
CAST() AS SIGNED
およびUNSIGNED
-
CAST()
については他にも制限あり - サポートされているものは MySQL HeatWave User Guide の Section 2.12.3 Cast Functions and Operators を参照
-
-
JOIN
述語としてのCOALESCE()
-
MET
やEurope/Amsterdam
などの名前付きタイムゾーンでのCONVERT_TZ()
。-
CONVERT_TZ(O_ORDERDATE, 'UTC','EST')
はCONVERT_TZ(O_ORDERDATE, '+00:00','-05:00')
の形に書き換えると使用可
-
- 全文検索関数
- XML・JSON・空間(GIS)およびその他のドメイン固有の関数
- ユーザー定義関数(Loadable Functions)
-
GROUP_CONCAT()
と以下の組み合わせORDER BY
- 辞書エンコードされた文字列型の列(
RAPID_COLUMN=ENCODING=SORTED
)- 辞書エンコードについては MySQL HeatWave User Guide の 2.7.1 Encoding String Columns および 2.13.2 Dictionary Encoding を参照
WITH ROLLUP
- 厳密モード以外(
GROUP_CONCAT()
は厳密モードでのみ使用可能)
-
YEAR
型に対するGREATEST()
関数とLEAST()
関数-
GREATEST()
関数およびLEAST()
関数は、日付(日時・時間)型とそれ以外の型との比較には非対応
-
-
CASE
制御フロー演算子またはIF()
関数で、集約関数内になく、GROUP BY
キーの一部でもない列を含むもの -
YEAR
型の日付関数 -
VARLEN
エンコードされていない列に対する文字列関数および演算子- MySQL HeatWave User Guide の 2.7.1 Encoding String Columns を参照
- 文字列引数と非文字列引数が混在する比較関数で、HeatWave が不正な結果を返す場合がある
- 列挙(
ENUM
)データ型と日付(時刻・日時)データ型を持つAVG()
集約関数 - 列挙型・文字列型・日付(時刻・日時)データ型に対する以下の集約関数
STD()
STDDEV()
STDDEV_POP()
STDDEV_SAMP()
SUM()
VAR_POP()
VAR_SAMP()
-
VARIANCE()
- これらのうち、
SUM()
以外については準結合(セミジョイン)内でも使用不可- 例:
SELECT FROM A WHERE a1 IN (SELECT VAR_POP(b1) FROM B);
- 例:
- これらの集約関数は HeatWave 非対応のデータ型に対しては使用不可
- HeatWave 対応のデータ型については MySQL HeatWave User Guide の 2.10 Supported Data Types を参照
- これらのうち、
-
WEEK(date[,mode])
におけるdefault_week_format
システム変数-
mode
引数を使用する場合は、mode
値を明示的に定義する必要がある
-
正直なところ、これら全てを静的に解析して対処するのは難しいので、実際に SQL 文を流して判断するのが良さそうですね。
2023/9/6 追記:
続きの記事を書きました。