実務でSQLを使う:BigQueryの料金・権限とGA4データの扱い方|マーケターのためのSQL入門 第6回

田中 磨生

監修田中 磨生株式会社Abin 代表取締役

株式会社Abin代表取締役。AI SaaSの上場企業やHR系ベンチャーのマーケティング責任者を経て、2023年BtoBマーケティング特化のコンサルティング会社株式会社Abinを設立。創業から30社以上のBtoBマーケティングの戦略立案から実行までを行う。2025年には株式会社プロベルの役員に就任。NYマーケティング株式会社の執行役員も務める。

プロフィールを見る →

執筆Abin編集部

実務でSQLを使う:BigQueryの料金・権限とGA4データの扱い方|マーケターのためのSQL入門 第6回

この回で分かること:①マーケティングの現場でよく使われるクラウドのデータベース「BigQuery」の料金のしくみと、思わぬ請求を防ぐ書き方、②分析に必要な権限の考え方と、安全に使うためのルール、③GA4(Googleアナリティクス4)のデータをBigQueryに出力したときの表の構造と、分析するときの注意点。前回は、ファネル・コホート・RFMといったマーケティングの分析をSQLで書きました。最終回は、ここまで学んだSQLを、実際の仕事の環境で安全に使うための知識をまとめます。

BigQueryを実務で使うときの3つの柱として、料金(読み込んだデータ量で決まる)、権限(読むだけの権限から始める)、GA4のデータ(日付ごとの表とイベントの構造)を並べ、それぞれの要点を示した図
図1:実務でSQLを使うときに押さえたい3つの柱

この回で紹介するBigQueryの料金・仕様は、2026年11月12日時点のGoogleの公式情報で確認したものです。料金や仕様は変わることがあるので、使う前に必ず公式の最新情報を確かめてください。また、この回のBigQuery向けのSQLは書き方の例で、実行結果はお使いのデータによって変わるため載せていません。

BigQueryとは

BigQueryは、Google Cloudが提供するデータウェアハウス(分析のために大量のデータをためておく場所)です。サーバーの準備や管理をしなくても、ブラウザからSQLを書いて、数億行のデータでも集計できます。GA4のデータを出力できることもあり、マーケティングの分析でよく使われています。

BigQueryでは、表を「プロジェクト.データセット.テーブル」の3段階の名前で指定します。プロジェクトはGoogle Cloudの契約の単位、データセットは表をまとめるフォルダのようなもの、テーブルが第1回から扱ってきた表です。名前は「`(バッククォート)」で囲んで書きます。

SELECT customer_id, prefecture
FROM `my-project.shop.customers`
WHERE prefecture = '東京都';

SELECT・WHERE・GROUP BY・JOINなど、この講座で学んだ書き方は、BigQueryでもそのまま使えます。違いが出やすいのは日付の扱いで、たとえば次のような関数を使います。

やりたいこと この講座の例(SQLite) BigQuery(GoogleSQL)の例
日付を「年-月」にする substr(order_date, 1, 7) FORMAT_DATE(‘%Y-%m’, order_date)
日付を月の初日にそろえる ―(文字の加工で対応) DATE_TRUNC(order_date, MONTH)
2つの日付の差(月・日) 年×12+月の差、julianday の差 DATE_DIFF(終わりの日, 始まりの日, MONTH)
「20261031」のような文字を日付にする ―(文字の加工で対応) PARSE_DATE(‘%Y%m%d’, ‘20261031’)

FREE MEMBER

無料会員なら、講座が受け放題・AI比較が1日5回

40以上の講座を最後まで読めて、学びの進み具合も記録できます。登録は30秒・無料です。

無料で会員登録する →
🔒 ここから先は無料会員限定です
この講座は、会員でない方は第2回まで読めます。第6回の続きと、残りの回はすべて、無料会員登録で読めます。
MEMBERS ONLY登録30秒・無料
続きは、無料会員登録ですぐ読めます。
会社のメールアドレスに届くリンクを開くだけ。このページに戻って、続きから読めます。
01
講座が全部、最後まで受け放題40以上の講座・300回超の連載を全回読めます。会員でない方は各講座の第1〜3回まで。
02
AI比較が1日5回あなたの会社向けの順位表と稟議書のたたき台を、何度でも作り直せます(会員でない方は1回)。
03
学びの進み具合をまとめて管理読んだ回・確認テストの成績・修了証をマイページに保存。PCでもスマホでも続きから。
04
AIへの質問が1日60回ツギノテの記事から答えを探すAI検索も、たっぷり使えます(会員でない方は20回)。
無料会員登録項目はすべて必須です
Gmail・Yahoo!メール・Outlook・携帯キャリアなどのフリーアドレスでは登録できません。お勤め先のメールアドレスを入れてください。
登録するとプライバシーポリシーに同意したものとみなします。

料金のしくみ:読み込んだデータ量で決まる

BigQueryの料金は、大きく「データをためておく料金(ストレージ)」と「SQLを実行して処理する料金(コンピュート)」に分かれます。SQLを書く人が特に意識すべきなのは、後者です。

公式の料金ページによると、2026年11月時点の主な内容は次のとおりです。

項目 内容
クエリの料金(オンデマンド) 処理したデータ量1TiBあたり6.25ドル
クエリの無料枠 毎月、最初の1TiBまでは無料
ストレージの無料枠 毎月、最初の10GiBまでは無料
ストレージの料金 90日以上更新されていない表は「長期保存」となり、料金がおよそ半分になる
最低の課金量 参照する表ごと、クエリごとに最低10MB分。MB単位で切り上げ
課金されないもの エラーになったクエリ、キャッシュから結果を返したクエリ

ここでいうオンデマンドとは、実行したSQLが処理したデータ量に応じて払う料金の形です。大量に使う組織向けには、処理能力(スロット)を時間単位で確保する「容量ベース」の料金もあります。

TiB(テビバイト)は約1.1兆バイトで、1TiB=1,024GiBです。たとえば、1回で50GiBを読み込むSQLなら、50÷1,024×6.25ドル=約0.31ドルです。1回は小さな金額でも、同じSQLを毎日何十回も実行したり、ダッシュボードが自動で何度も実行したりすると、無料枠をすぐに超えることがあります。

「選んだ列」の量で課金される

BigQueryの料金で最も大事なのが、次の点です。公式の料金ページには、BigQueryは列ごとにデータを持つ構造(列指向)で、選んだ列で処理したデータの合計に応じて課金される、と書かれています。さらに、LIMITで結果の件数を絞っても、選んだ列で処理したデータに応じて課金されることも明記されています。

つまり、次の2つのSQLは、結果は10行ずつでも、処理するデータ量が大きく違います。

-- 選んだ2列だけを読む
SELECT customer_id, prefecture
FROM `my-project.shop.customers`
LIMIT 10;

-- 表のすべての列を読む(LIMITで件数を絞っても、読む量は減らない)
SELECT *
FROM `my-project.shop.customers`
LIMIT 10;

第2回で「分析では SELECT * ではなく、必要な列だけを書く」と説明したのは、このためです。列の多い大きな表で SELECT * を使うと、それだけで料金が何倍にもなることがあります。

BigQueryの列指向の考え方を示した図。表の列が縦に分かれて保存され、2列だけを選ぶSQLはその2列分だけを読み、SELECT *はすべての列を読む。LIMITで行数を絞っても読む量は変わらない
図2:課金は「選んだ列」の量で決まり、LIMITでは減らない

BigQueryのオンデマンド料金について、公式の料金ページの説明に合うものはどれでしょう?

  1. LIMIT 10 を付ければ、10行分の料金しかかからない
  2. 選んだ列で処理したデータの量に応じて課金され、LIMITを付けても処理したデータ量は変わらない
  3. 実行した回数に応じて、1回いくらで課金される
答えと解説

正解は2です。BigQueryは列ごとにデータを持ち、選んだ列で処理したデータの合計で課金されます。LIMITは結果の件数を絞るだけで、読み込む量は減りません。必要な列だけを選ぶことが、費用を抑える基本です。

費用を抑える5つの習慣

BigQueryを安心して使うために、次の習慣をつけましょう。

  1. 必要な列だけを選ぶ:SELECT * を避け、使う列だけを書く。中身を確かめたいときは、BigQueryの画面の「プレビュー」を使う
  2. 実行前に処理量を確かめる:BigQueryの画面では、SQLを書くと実行前に「このクエリで処理されるデータ量」の見積もりが表示されます(クエリ検証ツール)。公式のガイドでも、実行前にプレビューして費用を見積もるよう勧めています
  3. 読む範囲を日付で絞る:日付で分割された表(パーティション分割テーブル)や、日付ごとに分かれた表(GA4の出力など)では、WHEREで日付の範囲を絞ると読む量が減ります
  4. 上限を設定する:「課金される最大バイト数」を設定すると、見積もりがその量を超えるクエリは、課金されずに失敗します
  5. 練習はサンドボックスや小さな表で:BigQueryのサンドボックスは、クレジットカードの登録なしで、ストレージ10GiB・クエリ毎月1TiBまで使えます。ただし、表は60日で自動的に消えるなどの制限があります
BigQueryの費用を抑える5つの習慣、必要な列だけを選ぶ・実行前に処理量を確かめる・日付で読む範囲を絞る・課金される最大バイト数を設定する・練習はサンドボックスで、を並べた図
図3:費用を抑える5つの習慣

よくある誤解:「無料枠があるから、気にしなくていい」

毎月1TiBの無料枠は、学習や小さな分析には十分な量です。しかし、GA4のデータを何年分もためた表に SELECT * を何度も実行したり、BIツールのダッシュボードが見られるたびに大きな表を読んだりすると、無料枠は思ったより早くなくなります。

チームで使うときは、誰がどのくらい処理しているかを確かめられるようにしておき、上限の設定(4番目の習慣)も組み合わせておくと安心です。

権限の考え方:読むだけの権限から始める

BigQueryでは、誰が何をできるかをIAM(アイデンティティとアクセス管理)の「ロール(役割)」で決めます。分析で関係するのは、主に次の2種類の権限です。

  • データを読む権限:表の中身を参照する権限。たとえば「BigQuery データ閲覧者(roles/bigquery.dataViewer)」は、データセットや表に付けると、表のデータを読む(クエリする)ことができる、と公式ドキュメントで説明されています
  • クエリを実行する権限:SQLを「ジョブ」として実行する権限(bigquery.jobs.create)。データを読む権限とは別に、クエリを実行するプロジェクトで必要になります

この2つが分かれているのは、「どのデータを見てよいか」と「誰の費用で処理するか」を別々に管理するためです。データを読む権限があっても、クエリを実行する権限がないと、SQLは実行できません。

安全に使うための3つのルール

  1. 分析用のアカウントは読むだけにする:第1回で説明したとおり、分析に必要なのはSELECTだけです。表を書き換えたり削除したりできる「データ編集者」以上のロールは、分析担当には付けないのが基本です
  2. 必要なデータセットだけに権限を付ける:プロジェクト全体ではなく、分析に使うデータセットや表の単位で権限を付けると、見なくてよいデータ(個人情報を含む表など)に触れずに済みます
  3. 個人情報の扱いを決めておく:氏名やメールアドレスなどの個人情報を含む表は、分析では使わない列を除いた表や、IDだけの表を用意するなど、扱いのルールを会社で決めておきます
BigQueryの権限の考え方を示した図。データセットや表には「データを読む権限」、クエリを実行するプロジェクトには「クエリを実行する権限」が必要で、分析担当には書き換えや削除の権限を付けないことを示している
図4:「データを読む権限」と「クエリを実行する権限」は別

マーケターが分析のためにBigQueryを使うとき、権限の付け方として最も適切なものはどれでしょう?

  1. 作業が止まらないように、プロジェクト全体の管理者のロールを付けてもらう
  2. 表を自由に直せるように、データ編集者のロールを付けてもらう
  3. 分析に使うデータセットを読む権限と、クエリを実行する権限だけを付けてもらう
答えと解説

正解は3です。分析に必要なのは、データを読むことと、クエリを実行することだけです。書き換えや削除ができる強い権限は、誤操作でデータを失うおそれがあるので付けないのが基本です。

この記事の監修者に相談できます

監修者の田中磨生が代表を務める株式会社Abinで、ご相談をお受けしています。

相談無料ツギノテ編集部に相談する

GA4のデータをBigQueryで扱う

GA4には、サイトやアプリの計測データをBigQueryに出力する機能(BigQuery Export)があります。管理画面のレポートでは見られない切り口で、生のイベントデータを分析できるのが利点です。GA4のヘルプによると、主な仕様は次のとおりです。

項目 内容
データセット プロパティごとに「analytics_プロパティID」という名前で作られる
日次の表 毎日、前日分のイベントを「events_YYYYMMDD」という名前の表に出力(日次エクスポート)
ストリーミングの表 当日のデータを数分で「events_intraday_YYYYMMDD」に出力(ストリーミングエクスポート。BigQuery側で追加の取り込み料金がかかる)
標準のプロパティの上限 日次エクスポートは1日あたり100万イベントまで
サンドボックスへの出力 無料のサンドボックスにも出力できるが、上限を超えると料金がかかる

サンドボックスに出力する場合は、表が60日で自動的に消えることに注意が必要です。長期間のデータで分析したいなら、請求先アカウントを設定した通常のプロジェクトに出力することを検討しましょう。

GA4の表の構造:1行=1回のイベント

GA4の出力の表は、1行=1回のイベントです。ページの閲覧、スクロール、購入などのイベントが起きるたびに1行ずつ記録されます。よく使う列は次のとおりです。

列 内容
event_date イベントが記録された日。「YYYYMMDD」の形の文字
event_timestamp イベントの時刻(UTCのマイクロ秒)
event_name イベントの名前(page_view、purchase など)
user_pseudo_id ユーザーを表す仮のID(ブラウザやアプリごとに割り当てられる)
event_params イベントのパラメータ(ページのURLなど)。1つの行の中に複数の「キーと値」を持つ

日付ごとの表をまとめて読む

GA4の表は日付ごとに分かれているので、期間をまとめて分析するときは、表の名前の最後を「(ワイルドカード)」にして、_TABLE_SUFFIX*で日付の範囲を指定します。BigQueryの公式ドキュメントでは、_TABLE_SUFFIX で絞ると読み込むデータ量を大きく減らせ、費用の削減につながると説明されています。

10月の日ごとの購入ユーザー数を出すSQLの例です(プロジェクトIDとプロパティIDは架空のものです)。

SELECT PARSE_DATE('%Y%m%d', event_date) AS day,
       COUNT(DISTINCT user_pseudo_id)    AS purchasers
FROM `my-project.analytics_123456789.events_*`
WHERE _TABLE_SUFFIX BETWEEN '20261001' AND '20261031'
  AND event_name = 'purchase'
GROUP BY day
ORDER BY day;

第3回のGROUP BY、第5回のCOUNT(DISTINCT …) がそのまま使われていることが分かるでしょう。event_date は文字なので、PARSE_DATE で日付に変えてから使っています。

ただし、_TABLE_SUFFIX の条件にサブクエリなどの「定数でない式」を使うと、読む表を絞り込めない、と公式ドキュメントに注意書きがあります。’20261001′ のように、値を直接書くのが確実です。

event_params から値を取り出す

ページのURLなどは、event_params という「1行の中に複数のキーと値を持つ列」に入っています。値を取り出すには、UNNESTでこの列を展開し、キーの名前で探します。

SELECT
  (SELECT value.string_value
   FROM UNNEST(event_params)
   WHERE key = 'page_location') AS page_location,
  COUNT(*) AS page_views
FROM `my-project.analytics_123456789.events_*`
WHERE _TABLE_SUFFIX BETWEEN '20261001' AND '20261031'
  AND event_name = 'page_view'
GROUP BY page_location
ORDER BY page_views DESC
LIMIT 20;

かっこの中の SELECT は「その行の event_params の中から、キーが page_location のものの文字の値を取り出す」という意味です。値が文字なら value.string_value、整数なら value.int_value に入っています。最初は難しく感じるかもしれませんが、「よく使うパラメータの取り出し方」をいくつか保存しておけば、あとは組み合わせるだけです。

GA4のBigQuery出力の表の構造を示した図。1行が1回のイベントで、event_date・event_name・user_pseudo_idの列のほか、event_paramsの中にpage_locationなど複数のキーと値が入れ子になっており、UNNESTで展開して取り出すことを示している
図5:GA4の表は「1行=1イベント」、パラメータは入れ子になっている

GA4の日付ごとの表(events_YYYYMMDD)を10月分まとめて読むとき、費用を抑える書き方として最も適切なものはどれでしょう?

  1. events_* と書き、WHERE _TABLE_SUFFIX BETWEEN ‘20261001’ AND ‘20261031’ で範囲を値で直接指定する
  2. events_* と書き、日付の範囲は指定せずに全期間を読んでから、結果を目で絞る
  3. SELECT * と LIMIT 100 を組み合わせて、読む量を減らす
答えと解説

正解は1です。_TABLE_SUFFIX で範囲を絞ると、読み込む表が減り、処理するデータ量も減ります。範囲は値で直接書くのが確実です。LIMITでは読む量は減りません。

実務ではこう使う

SQLを実務で使い続けるために、最後に「チームで使う」ための工夫をまとめます。

  1. よく使うSQLを共有の場所に保存する:目的・定義(期間、数え方)・作った人をコメントに書いて保存し、誰が実行しても同じ数字が出るようにする
  2. 管理画面の数字と照合する:GA4の管理画面とBigQueryの数字は、集計の方法の違いなどで完全には一致しないことがあります。どの程度の差なら許容するか、どちらを正とするかを決めておきます
  3. 費用と権限を定期的に見直す:誰がどのくらい処理しているか、不要な権限が残っていないかを、月に1回などで確かめる
  4. 集計の仕組み化を検討する:毎日・毎月同じ集計をするなら、結果の表を自動で作っておき、ダッシュボードはその小さな表を読むようにすると、費用も速さも改善します
SQLをチームで使い続けるための4つの工夫、よく使うSQLを共有して保存する・管理画面の数字と照合する・費用と権限を定期的に見直す・集計を仕組み化する、をカードで示した図
図6:SQLを「チームの道具」にする4つの工夫

社内のデータ基盤を整えたい場合は、DWHおすすめ比較やETLツールおすすめ比較が、BigQueryそのものの評判を知りたい場合はBigQueryの評判が参考になります。GA4の計測の設定から学び直したいなら、アクセス解析とGA4(全8回)もあわせてどうぞ。

FOR BUSINESS

マーケティング・DXの発注先選びに迷ったら

ツギノテを運営する株式会社Abinは、BtoBマーケティングに特化したコンサルティング会社です。創業から30社以上のBtoBマーケティングを支援してきました。

相談無料ツギノテ編集部に相談する

無料会員登録(講座受け放題・AI比較)/セミナーと資料を見る

この回のまとめ

  • BigQueryでは表を「プロジェクト.データセット.テーブル」で指定し、この講座で学んだSQLがそのまま使えます。日付の関数は方言が出やすいところです。
  • オンデマンドの料金は、処理したデータ量(1TiBあたり6.25ドル、毎月1TiBまで無料。2026年11月時点)で決まり、選んだ列の量で課金されます。LIMITでは減りません。
  • 必要な列だけを選ぶ、実行前に処理量を確かめる、日付で範囲を絞る、上限を設定する、練習はサンドボックスで、の5つの習慣で費用を抑えます。
  • 「データを読む権限」と「クエリを実行する権限」は別です。分析用のアカウントは読むだけにし、必要なデータセットに絞って権限を付けます。
  • GA4の出力は日付ごとの表で、1行=1イベントです。_TABLE_SUFFIX で期間を絞り、event_params は UNNEST で取り出します。

確認テスト

BigQueryで、1回あたり200GiBを処理するSQLの料金(オンデマンド、無料枠を除く)として最も近いものはどれでしょう?(1TiB=1,024GiB、1TiBあたり6.25ドルとして計算)

  1. 約0.12ドル
  2. 約12.5ドル
  3. 約1.2ドル
答えと解説

正解は3です。200÷1,024×6.25=約1.22ドルです。1回は小さな金額でも、何度も実行すると積み重なるので、処理量を実行前に確かめる習慣が大切です。

BigQueryで費用を抑えるための習慣として、適切でないものはどれでしょう?

  1. 必要な列だけを選び、SELECT * を避ける
  2. LIMIT を付ければ処理量が減るので、大きな表でも SELECT * で問題ない
  3. 「課金される最大バイト数」を設定して、大きすぎるクエリを止める
答えと解説

正解は2です。公式の料金ページにあるとおり、LIMITを付けても選んだ列で処理したデータ量は変わりません。費用を抑えるには、読む列と範囲を絞ることが大切です。

GA4のBigQuery出力の表についての説明として正しいものはどれでしょう?

  1. 1行=1回のイベントで、日付ごとに events_YYYYMMDD という表に出力される
  2. 1行=1人のユーザーで、すべての期間が1つの表にまとまっている
  3. 1行=1回のセッションで、ページのURLは必ず独立した列になっている
答えと解説

正解は1です。GA4の出力は、イベントが起きるたびに1行ずつ記録され、日次エクスポートでは日付ごとの表になります。ページのURLなどは event_params の中に入っているので、UNNESTで取り出します。

BigQueryのサンドボックスについての説明として正しいものはどれでしょう?

  1. 料金がかからない代わりに、SQLの書き方がほかのBigQueryと違う
  2. 一度作った表は、削除するまでずっと残る
  3. クレジットカードの登録なしで使えるが、表は60日で自動的に消えるなどの制限がある
答えと解説

正解は3です。サンドボックスは学習や試しに使うのに便利ですが、表が60日で消えるなどの制限があります。長期間のデータを分析するなら、請求先アカウントを設定した通常のプロジェクトを検討します。

全6回を終えて

この講座では、データベースの表・行・列という基本から始めて、SELECT・WHERE・ORDER BYで取り出す、GROUP BYでまとめる、JOINでつなぐ、WITH句で組み立ててファネル・コホート・RFMを書く、そしてBigQueryで安全に使う、というところまで進みました。

SQLは、書いた分だけ上達します。まずは自分の仕事の数字を1つ選び、「普段は誰かに出してもらっている集計」を、自分のSQLで出してみてください。管理画面と数字が合ったとき、あるいは合わなかった理由が分かったとき、データの見え方がきっと変わっているはずです。

参考資料

  • Google Cloud「BigQuery pricing」(確認日:2026年11月12日)https://cloud.google.com/bigquery/pricing
  • Google Cloud「BigQuery サンドボックスを使用する」(確認日:2026年11月12日)https://docs.cloud.google.com/bigquery/docs/sandbox
  • Google Cloud「Estimate and control costs」(確認日:2026年11月12日)https://docs.cloud.google.com/bigquery/docs/best-practices
  • Google Cloud「Control access to resources with IAM」(確認日:2026年11月12日)https://docs.cloud.google.com/bigquery/docs/control-access-to-resources-iam
  • Google Cloud「Query multiple tables using a wildcard table」(確認日:2026年11月12日)https://docs.cloud.google.com/bigquery/docs/wildcard-tables
  • Google Cloud「GoogleSQL:Date functions」(確認日:2026年11月12日)https://docs.cloud.google.com/bigquery/docs/reference/standard-sql/date_functions
  • Googleアナリティクス ヘルプ「[GA4] BigQuery Export」(確認日:2026年11月12日)https://support.google.com/analytics/answer/9358801
  • Googleアナリティクス ヘルプ「[GA4] BigQuery Export スキーマ」(確認日:2026年11月12日)https://support.google.com/analytics/answer/7029846

この記事は役に立ちましたか?

いま読まれている記事ランキング

    ランキングをもっと見る →

    この記事の内容について

    掲載している情報の修正や削除をご希望の場合は、こちらからご連絡ください。

    修正・削除の依頼

    NEXTあわせて読みたい

    ツギノテの記事一覧へ

    編集方針

    • 各社の公式サイトを、確認日を書いて調べています
    • 掲載企業から報酬は受け取っていません
    • 有償の掲載がある場合は「PR」と明記します

    運営:株式会社Abin

    © Abin Co., Ltd.