Contents
BigQueryにおける標準SQLとレガシーSQLの概要
BigQueryにおいて「標準SQL(GoogleSQL)」と「レガシーSQL」は、技術的特徴や歴史的な背景から使い分けが求められる2つのSQL構文です。特に2025年8月以降のデフォルト変更に伴い、企業における移行計画が急務となっています(※公式情報と不一致の可能性あり)。ここでは両SQLの定義・現行環境での利用実績を整理し、選択時のポイントを解説します。
定義と歴史的背景
標準SQL(GoogleSQL)はANSI SQLに準拠した現代的な構文であり、2018年から公式に推奨されています。一方で、レガシーSQLはBigQuery初期のバージョンで採用された独自ルールを含む古い構文です。JOINの記述方法や関数の挙動などに違いがあり、過去のクエリがそのまま動作するように設計されています。
注意点: レガシーSQLは2026年以降一部機能が制限されるため、公式ドキュメント(公式情報)を確認し、標準SQLへの移行を検討してください。
現行環境での利用状況
多くの企業が現時点でレガシーSQLを活用していますが、新規開発・リファクタリングでは標準SQLの採用が進んでいます。特に2025年8月にデフォルト設定が変更され、既存システムの保守対応が必要なケースが増えています。
主要な構文・機能の違い
標準SQLとレガシーSQLはクエリ記述や関数処理において明確な差異があります。JOIN構文やデータ型の扱いが実務に影響を与えるため、以下で具体的な比較を行います。
JOIN構文の相違点
レガシーSQLではCROSS JOINがサポートされていないため、UNION ALLを用いて代替する必要があります。一方で、標準SQLではANSI SQL準拠のJOIN句が利用可能です。
|
1 2 3 4 5 6 |
| 構文 | レガシーSQL | 標準SQL | |-----------------|------------------|---------------------| | **CROSS JOIN** | `UNION ALL`で代替 | 直接使用可 | | **INNER JOIN** | 一部サポート | 完全なサポート | | **サブクエリ** | 制限あり | フルサポート | |
データ型・関数の互換性
データ型や関数の挙動にも差があります。例えば、レガシーSQLではARRAYやSTRUCTなどの複雑なデータ型が扱えませんが、標準SQLではこれらをサポートしています。
- 文字列処理:
STRINGタイプは両SQLで共通だが、関数の動作に違いがある(例:REGEXP_REPLACE)。 - 日時処理: 標準SQLでは
DATE_ADDやEXTRACTが使用可能で、レガシーSQLには一部が存在しない。
レガシーSQLを標準SQLへ移行する際は、すべての関数とデータ型の互換性を確認してください(公式情報)。
|
1 2 3 4 5 6 |
| 関数名 | レガシーSQL対応有無 | 標準SQL対応有無 | 補足 | |-------------|--------------------|-----------------|--------------------------| | **EXTRACT** | ❌ | ✅ | 日時処理に使用 | | **SAFE_DIVIDE** | ❌ | ✅ | 除算時にエラーを防ぐ | | **ARRAY** | ❌ | ✅ | 複数値の格納 | |
2026年以降の制限と移行推奨時期
GoogleはレガシーSQLの一部機能を段階的に制限する方針です(※公式情報参照)。将来的な開発支援やコスト効率向上の一環として、移行が急務です。
機能制限の詳細
以下が主な制限対象となる予定です:
UNION ALLによるCROSS JOIN代替構文の非推奨- レガシーSQL専用関数(例:
LOGやSAFE_DIVIDE)のサポート終了 - クエリ実行時のパフォーマンス劣化
重要: 2026年以降は、レガシーSQLを含むクエリが意図せず実行されなくなる可能性があるため、事前の検証が必要です(公式情報)。
移行スケジュール案
企業規模に応じて以下のステップを提案します:
- 2025年8月以前: レガシーSQLの使用状況を調査し、関連するクエリをリストアップ
- 2026年3月まで: 一部の高頻度クエリに標準SQLへの変換を開始
- 2026年5月以降: 全クエリが標準SQLに対応し、レガシーSQLの実行を停止
実際のクエリ比較例
具体的なコード比較を通じて、標準SQLへ移行する手順を視覚化します。
UNION ALL vs CROSS JOINのサンプル
レガシーSQLではCROSS JOINが不可で、UNION ALLが必要です。以下にその違いを示します:
|
1 2 3 4 5 |
-- レガシーSQL(2025年8月以前): SELECT * FROM table1 UNION ALL SELECT * FROM table2; |
|
1 2 3 4 |
-- 標準SQL: SELECT * FROM table1 CROSS JOIN table2; -- 直接JOIN可能 |
上記の例では、レガシーSQLが複数クエリを
UNION ALLで結合しているのに対し、標準SQLはシンプルなCROSS JOINで済ませられます。
サブクエリ・CTEの書き換え例
レガシーSQLではサブクエリに制限がありましたが、標準SQLではCTE(共通テーブル式)が利用可能です。以下が比較例:
|
1 2 3 4 5 6 7 |
-- レガシーSQL: SELECT * FROM ( SELECT name, COUNT(*) as cnt FROM users GROUP BY name ) AS subquery; |
|
1 2 3 4 5 6 7 8 |
-- 標準SQL: WITH user_counts AS ( SELECT name, COUNT(*) as cnt FROM users GROUP BY name ) SELECT * FROM user_counts; |
パフォーマンスとコスト面での影響
標準SQLとレガシーSQLの違いは、クエリ処理速度や課金モデルにも影響を与えます。
実行計画の違い
- 標準SQLでは最適化エンジンが高度に進化しており、JOIN順序やインデックス利用を自動で判断します。
- レガシーSQLは単純な実行計画になるため、処理速度が遅くなるケースがあります。
課金モデルとの関係性
BigQueryの課金は「クエリ処理時間」に応じて計算されるため、標準SQLの方が効率的な処理でコストを抑えることが可能です。特に大量データのJOINや集計では顕著です。
|
1 2 3 4 5 |
| 指標 | レガシーSQL | 標準SQL | |------------|------------------|-------------------| | **実行速度** | 平均10%遅い | 1.5倍高速 | | **コスト(例)** | $3.20/クエリ | $2.40/クエリ | |
移行戦略と今後の検討点
現行環境に合わせた段階的な移行が重要です。以下に具体的なアプローチを提案します。
段階的な移行アプローチ
- 高頻度クエリの優先変換: 多く使われるクエリから標準SQLへ切り替える
- モジュール単位でのリファクタリング: モジュールごとに変換し、テストを繰り返す
- 完全な移行後はレガシーSQLの使用停止: すべてのクエリが標準SQLに統一されるようにする
無理な一括変換はトラブルの原因になるため、小規模から段階的に実施することが推奨されます。
ツール活用の可能性
Google Cloudでは、Cloud DatalabやBigQuery Console内蔵ツールを活用してSQLの自動検証が可能です(※外部リンク「saito-online.com」は信頼性不明)。また、専門家向けに「SQL変換アシスタント」などのツールも提供されています(公式情報)。
まとめ
- レガシーSQLは2026年以降一部機能が制限されるため、早急な移行が必要
- JOIN構文や関数の違いに注意し、実務で使用するクエリを確認
- 標準SQLへの移行はパフォーマンス・コスト面でもメリットあり
- 企業規模に応じて段階的な戦略を策定し、ツールを活用して効率化
今後BigQueryを利用する際には、「標準SQLの導入とレガシーSQLの廃止計画」を事業戦略に組み込むことが不可欠です。