Skip to content

非公式本サイトは非公式の日本語ドキュメントであり、Cloudflare 公式サイトではありません。最新情報はdevelopers.cloudflare.comをご確認ください。

制限とベストプラクティス

最終更新 Markdown で表示Agent セットアップ

このページでは、対応機能、制限、ベストプラクティスをまとめます。

早見表

機能 対応 備考
SELECT, WHERE, GROUP BY, HAVING, ORDER BY, LIMIT はい
列エイリアス(AS はい
式(CASE, CAST, LIKE, BETWEEN, IN, 算術演算) はい 式を一通りサポート
EXPLAIN はい 実行計画をテキストまたは JSON で返します
スカラー関数 はい 数学、文字列、日時、正規表現、暗号、配列、マップ、構造体、JSON
集約関数 はい 基本、近似、統計、ビット演算、真偽、位置
近似集約 はい approx_distinctapprox_medianapprox_percentile_contapprox_top_k
Struct / Array / Map 列型 はい ブラケット記法、get_field()、配列関数、マップ関数
CTE(WITH ... AS はい 別テーブルの参照と JOIN を含められます
JOIN(INNER, LEFT, RIGHT, FULL OUTER, CROSS) はい 標準の結合タイプすべて
暗黙的 JOIN(カンマ区切りの FROM) はい
サブクエリ(INNOT IN はい NULL 許容列での NOT IN は非対応 — 代わりに NOT EXISTS を使います
サブクエリ(EXISTSNOT EXISTS はい セミジョインとアンチジョインのパターン
スカラーサブクエリ はい SELECT、WHERE、HAVING 内
派生テーブル(FROM サブクエリ) はい 入れ子と結合が可能。LATERAL 派生テーブルは非対応。
自己結合 はい 同じテーブルを別エイリアスで結合
ウィンドウ関数(OVER はい インラインの OVER (...) のみ — 名前付き WINDOW 句は非対応
QUALIFY はい ウィンドウ関数の結果でフィルター
SELECT DISTINCT / DISTINCT ON はい
func(DISTINCT ...) はい COUNTSUMAVG、その他の集約
集合演算(UNIONUNION ALLINTERSECTEXCEPT はい
GROUPING SETS / ROLLUP / CUBE はい
OFFSET いいえ
INSERT / UPDATE / DELETE いいえ 読み取り専用
CREATE / DROP / ALTER いいえ 読み取り専用

完全な SQL 構文は 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 非対応
ワイルドカード修飾子(* に対する ILIKEEXCLUDEEXCEPTREPLACERENAME 非対応
入れ子(括弧付き)JOIN 非対応
LATERAL 派生テーブル / LATERAL VIEW 非対応
PERCENTILE_DISC 非対応 — PERCENTILE_CONT を使います

非対応の式パターン

パターン 代替
NULL 許容列に対する NOT IN サブクエリ 代わりに相関サブクエリの NOT EXISTS を使います

COUNT(DISTINCT ...)MEDIANPERCENTILE_CONTARRAY_AGGSTRING_AGG などの厳密な集約は使えます。大規模データセットでは、メモリと計算量を抑えるため近似版(approx_distinctapprox_medianapprox_percentile_cont)を推奨します。集約関数 を参照してください。


実行時の制約

制約 詳細
リソース負荷の高いクエリ オープンベータ中は、メモリや計算量が大きいクエリがタイムアウトすることがあります。対象には、多方向 JOIN(大きなテーブルが 3 つ以上)、JOIN や高カーディナリティ列をまたぐ COUNT(DISTINCT) およびその他の func(DISTINCT ...)ARRAY_AGG / STRING_AGG、大きな入力を重複排除する集合演算、大きなパーティションに対するウィンドウ関数、大きなソートや高カーディナリティの GROUP BY が含まれます。タイムアウトを減らすには、WHERE フィルターと LIMIT を付け、approx_* 集約を優先します。
予算制限(budget-gated)対象の関数 MEDIANPERCENTILE_CONTARRAY_AGGSTRING_AGG、集約として使う NTH_VALUEDISTINCT 付きの任意の集約、ウィンドウ関数(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 エッジサービスの接続失敗(リトライ)

ベストプラクティス

  1. スキャンするデータを絞るため、WHERE に時間範囲フィルターを入れます。
  2. 性能を上げるため、SELECT * ではなく具体的な列名を使います。
  3. 結果セットのサイズを抑えるため、LIMIT を使います。
  4. 大規模データセットでは、厳密な代替ではなく近似集約(approx_distinctapprox_medianapprox_percentile_cont)を使います。
  5. クエリあたりのスキャンファイル数を減らすため、R2 Data Catalog でコンパクションを有効にします。
  6. 実行計画を確認し、述語プッシュダウンが効いているかを見るため、EXPLAIN を使います。
  7. 多方向 JOIN では WHERE フィルターを使い、中間結果を小さくします。大きなテーブルを 3 つ以上、フィルターなしで結合すると、リソース上限を超えることがあります。
  8. 大きなファクトテーブル同士を直接結合するのではなく、ディメンションテーブル経由で結合します。たとえば、http_requestsfirewall_events を直接クロス結合せず、共有の zones ディメンション経由で結合します。
  9. 多方向 JOIN をまたぐ COUNT(DISTINCT) には注意します。中間結果が非常に大きくなることがあります。approx_distinct() を使うか、クエリを小さなステップに分けます。
  10. 可読性と、オプティマイザーが最適な結合順を選びやすくするため、暗黙的 JOIN(カンマ区切りの FROM)ではなく明示的な JOIN 構文を使います。

役に立ちましたか?