はじめに
こんにちは。
夏が始まったと思ったらもう暦上では9月。夏の終わりです。時間の流れは早いですね。
こんな感じでいつの間にか秋が来て冬が来て年末になっていたり…不思議です。
今回ですが、BigQueryに「いつの間にやってきた」とある話をしていきたいと思います。
業務でBigQueryを利用している場合、コストやパフォーマンスの調査でINFORMATION_SCHEMAを見ることが多いかなと思います。
そんなある日、INFORMATION_SCHEMA.JOBS ビューにquery_dialect
というカラムが追加されていました。
初めてみた側からすると「これは一体何なんだ」と思うこともあるので、今回はこちらについて簡単に解説をしていきます。
query_dialectとは
2025年5月頃にINFORMATION_SCHEMA.JOBS ビューに新しく追加されたカラムで、過去に実行されたクエリジョブがレガシーSQLもしくはStandardSQLかを判別することができます。
INFORMATION_SCHEMA.JOBS ビュー | Google Cloud
query_dialect
に表示される値は次の4種類とnull
が存在します。
- GOOGLE_SQL: StandardSQL(GoogleSQL)で実行されたジョブ
- LEGACY_SQL: レガシーSQLで実行されたジョブ
- DEFAULT_GOOGLE_SQL: デフォルト設定により、StandardSQL(GoogleSQL)として実行されたジョブ(SQLの種類を明示的に指定をしていなかった場合)
- DEFAULT_LEGACY_SQL: デフォルト設定により、レガシーSQLとして実行されたジョブ(SQLの種類を明示的に指定をしていなかった場合)
null表記について
null表記に関して、Google公式ドキュメントでは記載がありません。
しかし、以下の場合に「null」が表示されることがあります。
1. job_typeがQUERY以外の場合
query_dialect
はQUERYジョブに対して結果となる値を表示するため、LOADやCOPYといったジョブに対しては null
を表示することがあります。
2. 調査対象クエリの期間が古い場合
query_dialect
が最近追加されたカラムであるため、古い期間のクエリジョブについてはQUERYジョブであっても null
が表示される可能性があります。
実行が長期間開いていたり、不定期に実行されるクエリに関してはquery_dialect
のみでは調査しきれない可能性があるため、手動で確認が必要になります。
クエリ実行例
例として次のようなクエリで確認をすることができます。
SELECT
job_type,
query_dialect,
COUNT(*) as query_count
FROM `<project_name>.<region>.INFORMATION_SCHEMA.JOBS`
-- 必要に応じて期間指定等で絞り込み等
WHERE creation_time >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
GROUP BY job_type,query_dialect;
結果例
job_type | query_dialect | query_count |
---|---|---|
QUERY | GOOGLE_SQL | 510 |
QUERY | LEGACY_SQL | 400 |
LOAD | null | 300 |
なぜ、query_dialectが追加されたのか?
query_dialect
について、どのようなものなのか簡単に解説しましたが「どうしてこのカラムが追加されたのか?」と思った方もいると思います。
これは2025年8月から実施されたBigQueryの仕様変更に伴って追加されたものでした。
BigQuery Release Note |Google Cloud
【原文】
Starting August 1, 2025, GoogleSQL will become the default dialect for queries run from the command line interface (CLI) or API. To use LegacySQL, you will need to explicitly specify it in your requests or set the configuration setting default_sql_dialect_option to ‘default_legacy_sql’ at the project or organization level.
【日本語訳】
2025年8月1日より、コマンドラインインターフェース(CLI)またはAPIから実行されるクエリのデフォルトのSQLはGoogleSQLになります。 LegacySQLを使用するには、リクエストで明示的に指定するか、プロジェクトレベルまたは組織レベルでdefault_sql_dialect_option構成設定 を「default_legacy_sql」に設定する必要があります。
2025年7月まで次の機能においてBigQueryを利用する際、デフォルトで実行されるのはLegacySQLでした。
それが、2025年8月からStandardSQLがデフォルトになるように変更されました。
BQコマンドラインインタフェース(CLI)
BQAPIを利用したクエリ
そのため、8月以降もLegacySQLを利用する場合は、クエリもしくは組織プロジェクトレベルでLegacySQLを明示的に利用する設定をする必要が出てきました。
query_dialect
は、LegacySQLを実行していたクエリを調査するために追加されたものになります。
補足: LegacySQL(レガシーSQL)とは
BigQueryで最初期から利用されていた古いSQL構文のスタイルです。
2011年のBigQueryのリリース以降、2016年にStandardSQL(GoogleSQL)が登場するまで利用されていました。
現在はStandardSQLが主に利用されており、Googleもこちらの利用を推奨しています。
LegacySQLの構文、関数、演算子| Google Cloud
レガシーSQLとStandardSQLの違い
次の表は代表的なものについて比較したものになります。
比較項目 | レガシーSQL | StandardSQL |
---|---|---|
標準準拠 | Google独自の構文 | ANSI SQL(標準SQL)に準拠 |
サブクエリ/WITH句 | 不可もしくは制限 | 可 |
JOIN | 制限あり | 柔軟に利用できる |
予約キーワード/無効な識別子のエスケープ | 角括弧([]) | バッククォート(`) |
ARRAYとSTRUCT型のサポート | 不可(REPEATED,RECORD型で対応) | 可 |
現行利用について | 非推奨(利用の際は明示的に指定が必要) | 推奨(デフォルトで利用される) |
このように見ると、同じサービス内で利用されていたSQLではありつつも、違う点が多いことがわかります。
まとめ
BigQueryのINFORMATION_SCHEMA.JOBS ビューに新しく追加されたquery_dialect
カラムについて解説しました。
このカラムの持つ情報は所謂「ささる人にはささる」ものですが、長い間BigQueryを利用していたユーザーにとっては「どこでLegacySQLを使っていたか思い出せない」という事もあるので、そのような調査をするには便利なものとなります。
BigQueryは今後もさらなる機能の追加や仕様の変更もあると思うので、自分達が今利用しているクエリや設定をしっかり把握・調査し、仕様変更への対応をスムーズにできるようにしていきたいです。
参考資料
INFORMATION_SCHEMA.JOBS ビュー | Google Cloud
プロジェクトあたりのレガシーSQLクエリジョブの数 | Google Cloud