このページでは、対応機能、制限、ベストプラクティスをまとめます。
| 機能 | 対応 | 備考 |
|---|---|---|
| SELECT, WHERE, GROUP BY, HAVING, ORDER BY, LIMIT | はい | |
列エイリアス(AS) |
はい | |
| 式(CASE, CAST, LIKE, BETWEEN, IN, 算術演算) | はい | 式を一通りサポート |
| EXPLAIN | はい | 実行計画をテキストまたは JSON で返します |
| スカラー関数 | はい | 数学、文字列、日時、正規表現、暗号、配列、マップ、構造体、JSON |
| 集約関数 | はい | 基本、近似、統計、ビット演算、真偽、位置 |
| 近似集約 | はい | approx_distinct、approx_median、approx_percentile_cont、approx_top_k |
| Struct / Array / Map 列型 | はい | ブラケット記法、get_field()、配列関数、マップ関数 |
CTE(WITH ... AS) |
はい | 別テーブルの参照と JOIN を含められます |
| JOIN(INNER, LEFT, RIGHT, FULL OUTER, CROSS) | はい | 標準の結合タイプすべて |
| 暗黙的 JOIN(カンマ区切りの FROM) | はい | |
サブクエリ(IN、NOT IN) |
はい | NULL 許容列での NOT IN は非対応 — 代わりに NOT EXISTS を使います |
サブクエリ(EXISTS、NOT EXISTS) |
はい | セミジョインとアンチジョインのパターン |
| スカラーサブクエリ | はい | SELECT、WHERE、HAVING 内 |
| 派生テーブル(FROM サブクエリ) | はい | 入れ子と結合が可能。LATERAL 派生テーブルは非対応。 |
| 自己結合 | はい | 同じテーブルを別エイリアスで結合 |
ウィンドウ関数(OVER) |
はい | インラインの OVER (...) のみ — 名前付き WINDOW 句は非対応 |
QUALIFY |
はい | ウィンドウ関数の結果でフィルター |
SELECT DISTINCT / DISTINCT ON |
はい | |
func(DISTINCT ...) |
はい | COUNT、SUM、AVG、その他の集約 |
集合演算(UNION、UNION ALL、INTERSECT、EXCEPT) |
はい | |
GROUPING SETS / ROLLUP / CUBE |
はい | |
OFFSET |
いいえ | |
INSERT / UPDATE / DELETE |
いいえ | 読み取り専用 |
CREATE / DROP / ALTER |
いいえ | 読み取り専用 |
完全な SQL 構文は SQL リファレンス を参照してください。
| 機能 | エラー |
|---|---|
OFFSET |
unsupported feature: OFFSET clause is not supported |
名前付き WINDOW 句 |
unsupported feature: WINDOW clause is not supported |
INSERT / UPDATE / DELETE |
only read-only queries are allowed |
CREATE / DROP / ALTER |
only read-only queries are allowed |
UNNEST / PIVOT / UNPIVOT |
非対応 |
ワイルドカード修飾子(* に対する ILIKE、EXCLUDE、EXCEPT、REPLACE、RENAME) |
非対応 |
| 入れ子(括弧付き)JOIN | 非対応 |
LATERAL 派生テーブル / LATERAL VIEW |
非対応 |
PERCENTILE_DISC |
非対応 — PERCENTILE_CONT を使います |
| パターン | 代替 |
|---|---|
NULL 許容列に対する NOT IN サブクエリ |
代わりに相関サブクエリの NOT EXISTS を使います |
COUNT(DISTINCT ...)、MEDIAN、PERCENTILE_CONT、ARRAY_AGG、STRING_AGG などの厳密な集約は使えます。大規模データセットでは、メモリと計算量を抑えるため近似版(approx_distinct、approx_median、approx_percentile_cont)を推奨します。集約関数 を参照してください。
| 制約 | 詳細 |
|---|---|
| リソース負荷の高いクエリ | オープンベータ中は、メモリや計算量が大きいクエリがタイムアウトすることがあります。対象には、多方向 JOIN(大きなテーブルが 3 つ以上)、JOIN や高カーディナリティ列をまたぐ COUNT(DISTINCT) およびその他の func(DISTINCT ...)、ARRAY_AGG / STRING_AGG、大きな入力を重複排除する集合演算、大きなパーティションに対するウィンドウ関数、大きなソートや高カーディナリティの GROUP BY が含まれます。タイムアウトを減らすには、WHERE フィルターと LIMIT を付け、approx_* 集約を優先します。 |
| 予算制限(budget-gated)対象の関数 | MEDIAN、PERCENTILE_CONT、ARRAY_AGG、STRING_AGG、集約として使う NTH_VALUE、DISTINCT 付きの任意の集約、ウィンドウ関数(QUALIFY 経由も含む)は、実行前に予算制限されます。R2 SQL は実行前に必要なメモリを見積もり、スキャン対象が多すぎると 400 エラーで拒否します。処理行数を減らすため、GROUP BY または WHERE フィルターを追加します。 |
| 複数テーブルのクエリ | JOIN、サブクエリ(IN、EXISTS、スカラー、派生テーブル)、複数テーブルの CTE に対応しています。性能は中間結果のサイズに依存します。結合の選択性を抑えるには WHERE フィルターを使います。 |
| パーティション分割テーブルと未分割テーブル | パーティション分割された Iceberg テーブルと、されていないテーブルの両方に対応しています。 |
| Parquet 形式のみ | CSV、JSON、その他の形式は使えません。 |
| 読み取り専用 | R2 SQL はクエリエンジンであり、データベースではありません。書き込みはできません。 |
now() / current_time() の精度 |
10ms 境界に量子化し、UTC に固定します。 |
| コード | 意味 |
|---|---|
| 40003 | 無効な SQL 構文 |
| 40004 | 無効なクエリ(非対応機能、不明な列、型の不一致) |
| 80001 | エッジサービスの接続失敗(リトライ) |
- スキャンするデータを絞るため、
WHEREに時間範囲フィルターを入れます。 - 性能を上げるため、
SELECT *ではなく具体的な列名を使います。 - 結果セットのサイズを抑えるため、
LIMITを使います。 - 大規模データセットでは、厳密な代替ではなく近似集約(
approx_distinct、approx_median、approx_percentile_cont)を使います。 - クエリあたりのスキャンファイル数を減らすため、R2 Data Catalog でコンパクションを有効にします。
- 実行計画を確認し、述語プッシュダウンが効いているかを見るため、
EXPLAINを使います。 - 多方向 JOIN では
WHEREフィルターを使い、中間結果を小さくします。大きなテーブルを 3 つ以上、フィルターなしで結合すると、リソース上限を超えることがあります。 - 大きなファクトテーブル同士を直接結合するのではなく、ディメンションテーブル経由で結合します。たとえば、
http_requestsとfirewall_eventsを直接クロス結合せず、共有のzonesディメンション経由で結合します。 - 多方向 JOIN をまたぐ
COUNT(DISTINCT)には注意します。中間結果が非常に大きくなることがあります。approx_distinct()を使うか、クエリを小さなステップに分けます。 - 可読性と、オプティマイザーが最適な結合順を選びやすくするため、暗黙的 JOIN(カンマ区切りの
FROM)ではなく明示的なJOIN構文を使います。