Media > AI活用ユースケース > 情報システム > 業務部門が書いたデータ抽出のSQLを、社内の命名規約とBigQueryの性能の観点で点検し、直した版と理由を返す

業務部門が書いたデータ抽出のSQLを、社内の命名規約とBigQueryの性能の観点で点検し、直した版と理由を返す

実装ステータス:構成例 技術的に実現可能な構成として設計したもの。自社未検証

業務部門の担当者が書いたデータ抽出のSQLを、社内の命名規約と BigQuery の性能の観点で点検します。直した版のSQLと、直した箇所ごとの理由を、書いた本人とデータ担当に返します。

サマリー
生成AI
ChatGPT/Claude/Gemini
連携・自動化
Google Apps Script
対象業界
EC/IT・SaaS/小売/金融
対象部門
情報システム
対象業務
内容確認・チェック/書類作成
主な課題
人手が足りない/属人化している/確認ミスが多い
AIで行う処理
校正
主な効果
品質標準化/工数削減/教育コスト削減
導入難易度
★★☆☆☆
実装レベル
半自動化
費用感
API連携(中)
人間の確認
条件付き
現在工数
60h/月
AI導入後
20h/月
想定削減
67%
年間削減
480h
モデル条件による試算値です。実在企業の実績ではありません。

01導入前 / 導入後の業務フロー

導入前(Before)
  1. 業務部門の担当者が、BigQuery のコンソールでSQLを書いて試す
  2. 共有のフォームにSQLと目的(何に使うか、どの期間か)を書いて点検を依頼する
  3. データ担当がSQLを開き、読んでいる表と列、条件、結合を読み取る
  4. 社内の決まりに照らし、命名・別名・日付の扱いを見る
  5. 性能の観点で、読み込む列、パーティションの条件、結合の順、くり返し参照されるWITH句を見る
  6. 直した版を書き、ドライランで読み込む量を確かめる
  7. 直した箇所と理由を書いて、依頼者に返す
導入後(After)
  1. 人業務部門の担当者が、共有のフォームにSQLと目的を書いて点検を依頼する
  2. 自動フォームの送信をきっかけにスクリプトが動き、SELECT文かどうかと、読んでいる表を取り出す
  3. 自動読んでいる表の列の一覧と、パーティション・クラスタの列を、BigQuery のメタデータから取る
  4. 自動元のSQLをドライランにかけ、構文の誤りと読み込む量を取る
  5. 自動Claude API が、命名規約と性能の観点の一覧に沿ってSQLを点検し、直した版と直しごとの理由を返す
  6. 自動直した版をドライランにかけ、構文と読み込む量を確かめる
  7. 自動結果が変わりうる直しを含むときは、短い期間で元のSQLと直した版を実行し、結果を突き合わせる
  8. 自動点検の結果を一覧に書き、データ担当に知らせる
  9. 人データ担当が、直しと突き合わせの結果を確かめ、依頼者に返す
各工程の詳しい説明を読む
  1. 業務部門の担当者が、BigQuery のコンソールでSQLを書いて試す
  2. 共有のフォームにSQLと目的(何に使うか、どの期間か)を書いて点検を依頼する
  3. データ担当がSQLを開き、読んでいる表と列、条件、結合を読み取る
  4. 社内の決まりに照らし、命名・別名・日付の扱いを見る
  5. 性能の観点で、読み込む列、パーティションの条件、結合の順、くり返し参照されるWITH句を見る
  6. 直した版を書き、ドライランで読み込む量を確かめる
  7. 直した箇所と理由を書いて、依頼者に返す

(a)見る人が限られて待ちが出る。 BigQuery の性能の勘どころが分かるのは3名だけです。依頼が集中する月初は、返すまでに3〜4日かかります。 待ちきれずに、点検を通さないまま定期のレポートに組み込まれるSQLが出ます。

(b)指摘の基準が人によって違う。 ある担当は別名の付け方まで直し、別の担当は性能だけを見ます。同じSQLでも、誰に当たるかで返ってくる直しが変わります。 依頼者から見ると、決まりがどこにあるのか分かりません。

(c)直しで結果が変わったことに気づかない。 性能のために条件の位置を動かし、外部結合が内部結合と同じ結果になる直しを返してしまうことがあります。直した側も依頼者も、件数が少し減ったことに気づかないまま使います。

(d)同じ直しを毎月くり返す。 直した理由を毎回手で書くので、短く済ませがちです。理由が伝わらないので、次の月も同じSQLが届きます。 教える機会を、点検のたびに逃しています。

  1. 【人】 業務部門の担当者が、共有のフォームにSQLと目的を書いて点検を依頼する
  2. 【自動】 フォームの送信をきっかけにスクリプトが動き、SELECT文かどうかと、読んでいる表を取り出す
  3. 【自動】 読んでいる表の列の一覧と、パーティション・クラスタの列を、BigQuery のメタデータから取る
  4. 【自動】 元のSQLをドライランにかけ、構文の誤りと読み込む量を取る
  5. 【自動】 Claude API が、命名規約と性能の観点の一覧に沿ってSQLを点検し、直した版と直しごとの理由を返す
  6. 【自動】 直した版をドライランにかけ、構文と読み込む量を確かめる
  7. 【自動】 結果が変わりうる直しを含むときは、短い期間で元のSQLと直した版を実行し、結果を突き合わせる
  8. 【自動】 点検の結果を一覧に書き、データ担当に知らせる
  9. 【人】 データ担当が、直しと突き合わせの結果を確かめ、依頼者に返す

7番目が、この設計の分かれ目です。 直した版が速くなっても、結果が変われば使えません。 AIに「結果は変わりません」と言わせるのではなく、両方を実行して行の差を数えます。

9番目を残しているのも、意図してのことです。 AIの直しをそのまま依頼者に送らず、データ担当が一度見てから返します。 見る時間は短くなりますが、直しの責任は情報システムが持ちます。

02今回想定するシステム構成

構成図
業務部門の担当者(SQLと目的)
   ▼【トリガー】共有のフォームの送信
Google Apps Script
   ├── SELECT文か/読んでいる表の取り出し
   ├── BigQuery INFORMATION_SCHEMA.COLUMNS(列・パーティション・クラスタ)
   ├── BigQuery のドライラン(元のSQL)
   ▼
Claude API ── 命名規約と性能の観点で点検し、直した版と理由を返す(構造化出力)
   ▼
Google Apps Script
   ├── BigQuery のドライラン(直した版)
   └── 短い期間での実行と、結果の突き合わせ(結果が変わりうる直しのとき)
   ▼
点検の一覧(スプレッドシート)とデータ担当への通知
   ▼
【人】データ担当が確かめて依頼者へ返す
役割想定する製品代替候補
処理Claude API(命名規約と性能の観点での点検、直した版と理由の作成)OpenAI API、Gemini API
連携Google Apps Script(フォームの送信を起点に動かし、BigQuery と Claude API を呼ぶ)Cloud Run functions
保管点検の一覧(スプレッドシート)と、入出力のJSONBigQuery の記録用の表

データ基盤も社内の決まりも、新しく足すものではありません。 足すのは、フォームの送信で動くスクリプトと、社内の決まりを点検の観点の一覧に書き直した文書です。共有ドキュメントの決まりは文章で書かれているため、1項目ずつ番号を振った一覧にします。

点検の観点のうち、性能の側は BigQuery の公式のベストプラクティスに沿います。 公式には、必要な列だけを読むこと、**SELECT * に LIMIT を付けても読み込む量は変わらないこと、パーティションの列で絞ること、結合の前に集計して量を減らすこと、行数の多い表を先に置くことなどが挙げられています。WITH句は参照のたびに評価されうる**ので、何度も参照する重い計算は一時テーブルに落とすよう案内されています。

読み込む量の確かめには、ドライランを使います。 ドライランはクエリを実行せず、構文の確認と処理される量の見積もりを返し、スロットを使わず料金もかかりません。 ただし、行レベルのセキュリティがかかった表では常に0バイトが返り、外部データソースへのクエリでは下限として0バイトが返ることがあります。 この2つは読み込む量の比較に使えないので、印を付けて人に回します。

03どうやって実装するのか

Step1

処理の起点を決める

共有のフォームの送信を起点にします。 Google Apps Script のインストール型トリガーには、フォームの回答の送信で動くものがあります。インストール型トリガーは、作った人のアカウントで動きます。 個人のアカウントで作ると、その人が異動したときに止まり、BigQuery への権限もその人のものになります。データ基盤チームの共有の作業用アカウントで作ります。

1回の送信で1本のSQLを点検します。複数のSQLを1回の依頼にまとめさせません。 まとめると、どの直しがどのSQLのものか分からなくなります。フォームの項目は、SQL本文、目的(何に使うか)、想定する期間、定期のレポートに組み込むかどうか、の4つです。

Apps Script の1回の実行は6分までです。点検と突き合わせが6分に収まらないSQLは、突き合わせを後回しの実行に分けます。 一覧に「突き合わせ待ち」と書き、時間主導型のトリガーで続きを動かします。

Step2

入力データを集める

データ中身取得元
SQL本文依頼者が書いたSELECT文フォームの回答
目的と期間何に使うか、どの期間のデータか、定期のレポートに組み込むかフォームの回答
表の情報読んでいる表の列の名前と型、パーティションの列、クラスタの列の順BigQuery の INFORMATION_SCHEMA.COLUMNS
ドライランの結果構文の誤りの有無、処理される量BigQuery のドライラン
点検の観点の一覧命名規約(N-01〜)と性能の観点(P-01〜)の番号付きの項目データ基盤チームが作る文書

質を決めるのは、3行目と5行目です。 表の情報が無いと、AIはどの列がパーティションの列かを推測し、実在しない列の名前で条件を書きます。 観点の一覧が無いと、AIは一般的なSQLの書き方で直し、社内の決まりと違う直しを返します。

目的と期間は、性能の直しの判断に使います。 「直近3か月の店舗別の売上」が目的なら、日付の条件が無いSQLは全期間を読んでいることになります。目的に書かれていない期間の条件を、AIが足すことはさせません。 足すべきかを指摘し、足すかは依頼者が決めます。

Step3

データの取得方法を決める

取るもの方法注意
読んでいる表SQL本文から FROM・JOIN の後の表の名前を正規表現で拾うWITH句の名前は表から除く
列の一覧INFORMATION_SCHEMA.COLUMNS を表ごとに引くbigquery.tables.get と bigquery.tables.list の権限が要る
パーティション・クラスタ同じビューの is_partitioning_column と clustering_ordinal_positionクラスタが無い表は NULL
ドライランBigQuery の jobs.query を dryRun: true で呼ぶuseLegacySql は既定が true なので false を指定する

Apps Script からは、BigQuery の拡張サービスを有効にして呼びます。拡張サービスは公開されている API と同じオブジェクト・メソッド・パラメータを使うとされているので、jobs.query の dryRun をそのまま渡せます。

useLegacySql: false を必ず指定します。 jobs.query の useLegacySql は既定が true です。指定を忘れると、標準のSQLで書かれたSQLが構文の誤りとして返ります。 誤りの原因がSQLではなく呼び方にあるので、気づきにくい失敗です。

メタデータの権限は、メタデータの閲覧だけの役割で足ります。 INFORMATION_SCHEMA.COLUMNS を読むには roles/bigquery.metadataViewer などの役割が使えます。点検のスクリプトに、表の中身を読む権限を広く持たせません。 中身を読むのは、7番目の突き合わせのときだけです。

Step4

AIへ渡す前に整形する

  1. SELECT文かの確認 … 先頭が SELECT か WITH で、INSERT・UPDATE・DELETE・MERGE・CREATE・DROP を含まないことを確かめます。含むものは点検せずに返します
  2. コメントの扱い … -- と /* */ のコメントは残します。依頼者の意図が書かれていることが多いからです
  3. 表の名前の取り出し … プロジェクト・データセット・表の3つに分け、WITH句の名前を除きます
  4. 元のSQLのドライラン … 構文の誤りがあれば、点検の前に誤りの文を依頼者に返します
  5. 読み込む量の記録 … 元のSQLの処理される量を記録します。直した版との比較の基準になります
  6. 0バイトの印 … 行レベルのセキュリティがかかった表や外部データソースを読むSQLで0バイトが返ったら、印を付けます
  7. 表の情報の圧縮 … 列が多い表は、SQLで使っている列と、パーティション・クラスタの列だけに絞って渡します

1番目をAIに任せずにプログラムで行うのが要点です。 更新を含むSQLを点検の流れに入れると、7番目の突き合わせで更新が実行されてしまいます。 正規表現で弾き、迷うものは点検しません。

4番目で構文の誤りを先に返すのも、同じ理由です。 動かないSQLをAIに渡すと、AIは誤りを直したうえで性能の直しを重ね、どこが構文の直しでどこが性能の直しか分からない版が返ります。

Step5

AIに処理させる

させるのは、観点の一覧に沿って問題を拾い、直した版を書き、直しごとに観点の番号と理由と「結果が変わりうるか」を付けることです。

観点の種類例結果が変わりうるか
命名(N)WITH句の名前を処理の内容が分かる名前にする、別名を表の略称にそろえる、出力の列の名前をスネークケースにする変わらない(出力の列の名前を変えたときは、後ろの処理への影響を書く)
読み込む列(P-01)SELECT * を使う列だけに絞る出力の列が減るので変わる
パーティション(P-02)パーティションの列で期間を絞る期間が変われば変わる
結合(P-03〜)結合の前に集計する、行数の多い表を先に置く、自己結合をウィンドウ関数にする書き方によって変わる
WITH句(P-06)何度も参照する重い計算を一時テーブルに落とすことを勧める変わらない

3列目の印が、この構成でいちばん大事な区別です。 印が「変わる」「書き方によって変わる」の直しを含むときだけ、7番目の突き合わせを動かします。命名の直しだけなら突き合わせは要りません。

させないこと理由
業務の定義の変更売上に返品を含めるか、どの店舗を対象にするかは業務部門が決める
目的に無い期間の条件の追加期間を決めるのは依頼者。足すべきかの指摘にとどめる
表の情報に無い列の使用実在しない列の名前で直さない
更新・作成の文の提案点検の対象はSELECT文だけ
「結果は同じ」という結論同じかどうかは突き合わせで確かめる

5行目がいちばん起きやすい失敗です。 書き換えた理由に「結果は変わりません」と添えるのは自然な書き方ですが、その一文を信じて突き合わせを省くと、第3章の(c)がそのまま起きます。

Step6

指示内容を固定する

あなたは社内のデータ基盤チームで、業務部門の担当者が書いたSELECT文を
点検する担当者を手伝う立場です。
渡された「点検の観点の一覧」に沿ってSQLを点検し、直した版と、
直しごとの理由を返してください。

【厳守事項】
- 直しは、観点の一覧に載っている項目に当たるものだけにしてください。
  一覧に無い好みの書き方で直さないでください。
- 直しごとに rule_id(N-01 や P-02)を必ず書いてください。
- 表の情報に載っていない列の名前を使わないでください。
- 業務の定義(何を売上とするか、どの店舗・会員を対象にするか)を変えないでください。
- 目的に書かれていない期間の条件を足さないでください。
  期間の条件が無いことが問題なら、notes に指摘として書いてください。
- 結果が変わりうる直しには result_may_change を true にしてください。
  LEFT JOIN の相手の表の条件を ON と WHERE の間で動かす直し、
  SELECT * を列の指定に変える直し、DISTINCT を外す直し、
  集計の位置を動かす直しは、必ず true にしてください。
- 「結果は変わりません」と書かないでください。結果が同じかどうかは
  別の手順で確かめます。
- before には元のSQLの該当部分を一字一句そのまま写してください。
- 理由(reason)は、依頼者が次に同じ書き方をしないで済むように、
  2文以内で書いてください。
- SELECT文以外の文(INSERT、UPDATE、CREATE など)を書かないでください。
- 直す箇所が無ければ、changes を空にして revised_sql に元のSQLを入れてください。

【点検の観点の一覧】{rules}
【SQL本文】{sql}
【目的と期間】{purpose}
【表の情報(列、型、パーティション、クラスタ)】{table_info}
【元のSQLのドライランの結果(処理される量)】{dry_run}

「結果は変わりませんと書かない」を明記しないと、理由のほぼすべてに付きます。 依頼者を安心させる書き方として自然に出てきます。禁じるのは、確かめていないことを確かめたように書くことです。

before を一字一句で写させるのは、後で照らすためです。 プログラムで元のSQLの中に before の文字列があるかを確かめ、見つからない直しは一覧から外して印を付けます。

Step7

出力形式を固定する

Claude API の構造化出力で、次の形のJSONを受け取ります。

{
  "revised_sql": "",
  "changes": [
    {
      "rule_id": "P-02",
      "category": "naming | performance",
      "before": "",
      "after": "",
      "reason": "",
      "result_may_change": true
    }
  ],
  "notes": [
    { "kind": "missing_date_filter | business_definition | other", "text": "" }
  ]
}

1つ目の理由は、rule_id で指摘を観点の一覧に結び付けられることです。 一覧に無い番号の直しは受け付けません。どの決まりに基づく直しかが、依頼者にも見えます。 理由の後ろに、観点の一覧の該当項目へのリンクを付けて返します。

2つ目は、result_may_change で突き合わせの要否を決められることです。 1つでも true があれば、スクリプトは突き合わせを動かします。

3つ目は、notes を直しと分けられることです。 期間の条件が無いことや、業務の定義に関わる疑問は、直さずに依頼者への問いとして返します。

スクリプトは、AIの出力の後に次の3つを機械で確かめ、点検の区分を決めます。

区分条件
返却可直した版のドライランが成功し、読み込む量が元より増えておらず、突き合わせが不要か差が0行
要確認突き合わせで差が出た、before が元のSQLに見つからない、0バイトの印がある
差し戻し直した版のドライランが失敗した

突き合わせは、元のSQLと直した版の両方に同じ1日分のパーティションの条件を足して実行し、EXCEPT DISTINCT で双方向の差の行数を数えます。実行には maximumBytesBilled を付けます。jobs.query の説明では、この上限を超えるクエリは料金がかからずに失敗するとされています。

-- 突き合わせの定型({orig} と {revised} は1日分の条件を足したもの)
WITH a AS ({orig}), b AS ({revised})
SELECT
  (SELECT COUNT(*) FROM (SELECT * FROM a EXCEPT DISTINCT SELECT * FROM b)) AS only_in_orig,
  (SELECT COUNT(*) FROM (SELECT * FROM b EXCEPT DISTINCT SELECT * FROM a)) AS only_in_revised

列の並びが変わる直しでは、この比較が通りません。 出力の列の名前や順を変えた直しを含むときは、突き合わせの前に、元のSQLの列の並びに合わせて直した版を包み直します。

Step8

システムへ連携する

つなぎ先方式内容
共有のフォームApps Script のインストール型トリガー依頼の受け付け
BigQueryApps Script の拡張サービス(jobs.query)メタデータ、ドライラン、突き合わせの実行
Claude APIUrlFetchApp から Messages API点検と直した版の作成
点検の一覧スプレッドシートへの追記区分、直し、読み込む量の比較
データ担当Google Chat またはメール「要確認」「差し戻し」を先に知らせる

Apps Script の UrlFetchApp は、Google Workspace のアカウントで1日10万回まで呼べます。月240件の点検なら上限に届きません。 トリガーの合計の実行時間は1日6時間までで、1件の点検は数十秒で終わる想定です。

依頼者への返却は、データ担当が一覧の行から送ります。 返す文面には、直した版、直しごとの理由と観点の番号、読み込む量の変化(例:元 820GB → 直した版 36GB)、notes の問いを並べます。読み込む量の変化を数字で返すと、依頼者が直しを受け入れる理由になります。

Step9

人が確認する

  1. 「要確認」と「差し戻し」を先に見る … 突き合わせで差が出たものは、どの直しが差を生んだかを見ます
  2. result_may_change が true の直しを読む … 差が0行でも、1日分では出なかっただけの可能性があります。月末や祝日の条件に関わる直しは、別の日でも突き合わせます
  3. notes の問いを確かめる … 期間の条件や業務の定義の疑問は、依頼者に聞く形で返します
  4. 命名の直しは流し見る … 出力の列の名前を変えた直しは、後ろのスプレッドシートやレポートが列の名前で参照していないかを依頼者に確かめます
  5. AIの直しを覆したら記録する … 観点の一覧の書き方を直す材料にします

2番目を省かないでください。 1日分の突き合わせで差が0行でも、月をまたぐ条件や、特定の曜日にしか無いデータでは差が出ることがあります。 突き合わせは「差が無いことの証明」ではなく、「差があることを見つける網」です。

目標は、240件をならして1件5分です。 「返却可」は直しを流し見て返し、「要確認」に時間を使います。

Step10

例外に対処する

起きること対応
SELECT文でない点検せず、「点検の対象外」と依頼者に返す
元のSQLが構文の誤りドライランの誤りの文を返し、直してから出し直してもらう
読んでいる表の権限が点検用のアカウントに無い「要確認」。データ担当が権限の付与かを判断する
0バイトが返った(行レベルのセキュリティ・外部データソース)読み込む量の比較をせず、「要確認」
before が元のSQLに見つからないその直しを外し、「要確認」
突き合わせが maximumBytesBilled で止まる期間をさらに短くするか、突き合わせを人に回す
6分を超えそう突き合わせを後回しの実行に分ける
構造化出力が refusal や max_tokens で終わる受け付けず、max_tokens を上げて再実行。続けば人へ
Step11

記録を残す

  • 依頼の日時、依頼者、SQL本文、目的と期間
  • 渡した表の情報と、そのときの観点の一覧の版
  • 元のSQLと直した版のドライランの結果(処理される量)
  • Claude API の出力の全文と、照合で外した直し
  • 突き合わせの条件(日付)と、双方向の差の行数
  • データ担当の最終の判断、覆した直し、依頼者に返した日時

観点の一覧の版を残すのは、決まりが後から変わるためです。 命名の決まりを変えると過去の直しの意味が変わり、当時の決まりが残っていないと、なぜその直しをしたかが追えません。

依頼者ごとの指摘の多い観点も、月に1回数えます。 同じ観点で毎月直されている人には、点検で返すより、短い勉強会で伝えたほうが早く減ります。

04実装レベルの3段階

最小構成:観点の一覧と表の情報を手で作り、手元のAIでSQLを点検させる / 1本ごとの点検と直し
半自動化:上記+フォームの送信で動き、メタデータの取得・ドライラン・突き合わせ・一覧への記録まで行う / 点検から確認の手前まで
本格構成:上記+定期のレポートのSQLを保存する場所を見張り、組み込まれる前に必ず点検を通す / 点検の漏れの防止まで

半自動化で、1件15分が5分になり、この段階が本記事の想定です。 データ担当の手元に残るのは、直しと突き合わせの結果を確かめて返す作業です。 本格構成は、点検を通さずに組み込まれるSQLを無くすための段階です。 時間は大きく変わりませんが、第3章の(a)で待ちきれずに組み込まれていたSQLが、点検の外に出なくなります。 スケジュールされたクエリの一覧を毎日引き、点検の記録に無いSQLを知らせる形が考えられます。 段階を飛ばさないでください。 半自動化の1か月で、観点の一覧の書き方のあいまいさと、突き合わせで差が出やすい直しの型が分かります。

05工数削減シミュレーション

前提値(モデル条件)
対象人数
3 名
月間件数
240 件
1件あたり現在時間
15 分
1件あたり導入後時間
5 分
現在  240件 × 15分 ÷ 60 = 60 時間/月
導入後 240件 × 5分 ÷ 60 = 20 時間/月
月間削減時間
40h
削減率
67%
年間削減時間
480h
年間金額換算(時間単価4,500円)
216万円
モデル条件による試算であり、実際の効果は業務内容・運用方法によって異なります。

自社条件で導入効果を整理したい方へ

このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。

AI活用について相談する

06向いている企業・向いていない企業

向いている
  1. BigQuery にデータ基盤を置き、営業企画・マーケティング・店舗運営などの業務部門の担当者が自分でSQLを書いてデータを抜き出している会社。定期のレポートに組み込む前や、大きな表を読む前に情報システムのデータ担当がSQLを見ているが、見る人が2〜3名に限られて待ちが出ている場合。社内のSQLの書き方の決まり(命名・別名・日付の扱い)を文書にできる場合。
向いていない
  1. 業務部門がSQLを書かず、抽出はすべて情報システムが行っている場合。更新・削除・テーブルの作成を伴うSQLの点検(実行前の安全確認は別の仕組みが要ります)。表の名前や列の名前そのものが外部に出せない情報に当たり、生成AIのAPIに送ることが社内の規程で認められていない場合。なお、抜き出した数字が業務の定義として正しいか(売上に返品を含めるか等)の判断は、この構成では代替できません。

07最小構成で試す方法

  1. 過去2か月に点検したSQLから20本を選ぶ(直したら結果が変わってしまった例を含める)
  2. 社内のSQLの書き方の決まりを、番号付きの観点の一覧(N-01〜、P-01〜)に書き直す
  3. 1本ずつ、読んでいる表の列の一覧とパーティションの列を手で書き出す
  4. 手元のAIサービスに、観点の一覧・SQL・表の情報を渡し、「一覧の項目に当たる直しだけをしてください。直しごとに番号と理由を書き、結果が変わりうるかを書いてください。結果は変わりませんと書かないでください」と指示する
  5. 出てきた直しを、当時データ担当が返した直しと比べ、直した版をコンソールでドライランにかける
出てきた内容判断
当時の担当と同じ直しが出て、ドライランが通ったスクリプトでつなぐ
一覧に無い好みの直しが混ざる指示と観点の一覧の書き方で直る。構成は有効
結果が変わる直しに印が付かない突き合わせを必ず入れる前提で進める

3行目が出ても、やめる理由にはなりません。 第7章で突き合わせを機械で行うのは、AIの印を当てにしないためです。

08実装時につまずきやすいポイント

問題対策
直しで結果が変わるresult_may_change に頼らず、性能の直しを含むときは突き合わせる
「結果は変わりません」と書く指示で禁じる。書かれていても突き合わせは省かない
実在しない列で直す表の情報を渡し、直した版のドライランで弾く
ドライランが構文の誤りを返すuseLegacySql: false を指定しているかを先に見る
0バイトが返る行レベルのセキュリティ・外部データソースの印を付け、比較しない
更新を含むSQLが流れる前処理で弾く。点検のアカウントに書き込みの権限を持たせない
トリガーが止まる個人のアカウントで作らない。共有の作業用アカウントで作る
好みの直しが混ざる観点の一覧に無い rule_id の直しを受け付けない
出力の列の名前を変えて後ろが壊れる列の名前の直しは、参照先の確認を依頼者に求める

上の2行が、この構成の失敗のほとんどです。 どちらも、AIが結果の同一性を保証できると扱ったときに起きます。同一性は、実行して数えるものです。

09セキュリティ・AIガバナンス上の注意点

この構成で扱うデータ: SQL本文、表と列の名前と型、ドライランの処理量、突き合わせで数えた差の行数です。表の中身(売上・会員の値)は Claude API に送りません。

  1. 送るのはSQLとメタデータだけにする … 突き合わせの結果は行数だけを扱い、差の行そのものを AI に渡しません
  2. SQLのコメントや条件の値に個人の情報が無いかを見る … 特定の会員番号やメールアドレスを条件に書いたSQLは、値を伏せてから送るか、点検の対象外にします
  3. 点検用のアカウントの権限を絞る … メタデータの閲覧と、突き合わせに要る表の読み取りだけにし、書き込み・表の作成の権限を持たせません
  4. 突き合わせに料金の上限を付ける … maximumBytesBilled を必ず指定し、上限を超えたら止まるようにします
  5. 直した版を自動で組み込まない … 返すのは直した版の案までで、定期のレポートに組み込むのは依頼者とデータ担当の判断です
  6. 表と列の名前の扱いを規程で確かめる … 表の名前に取引先名や施策名が入っているときは、外部の API に送ってよいかを先に決めます

誤りが起きた場合のリスクは、結果が変わった直しを使ってしまうことと、SQLに含まれた情報が外に出ることの2つです。 前者は突き合わせと人の確認で、後者は送る範囲の限定で防ぎます。

10まず何から始めるか

1週目:観点の一覧を作る

社内のSQLの書き方の決まりを、命名(N-01〜)と性能(P-01〜)の番号付きの項目に書き直します。 性能の側は BigQuery の公式のベストプラクティスから、自社の表で効くものを選びます。

2週目:20本で試す

過去に点検したSQLから20本を選び、手元のAIで点検させます。直したら結果が変わった例に、印が付くかと、突き合わせで差が出るかを最優先で見ます。

3週目:フォームからドライランまでをつなぐ

Apps Script でフォームの送信を受け、メタデータの取得、元のSQLと直した版のドライラン、一覧への記録までを作ります。この時点では突き合わせを動かさず、直しと読み込む量の変化だけを見ます。

4週目:突き合わせを足す

1日分のパーティションでの突き合わせと maximumBytesBilled を足し、区分を出します。

2か月目: すべての依頼をこの流れに乗せ、「要確認」の件数と覆した直しを毎週数えます。3か月目以降: 依頼者ごとの指摘の多い観点を数えて勉強会の題材にし、1件15分が何分になったかを実測します。同じ指摘が毎月くり返されなくなった時点で、この構成は完成です。


11関連ユースケース

12この仕組みを理解するための記事

13技術仕様の確認日・参考情報

技術仕様確認日:2026-10-14/最終更新:2026-10-14
確認した内容情報源確認日
必要な列だけを読むこと、SELECT * に LIMIT を付けても読み込む量は変わらないこと、パーティションで絞ること、結合の前に集計すること、行数の多い表を先に置くこと、WITH句が参照のたびに評価されうること、自己結合の代わりにウィンドウ関数を使うことGoogle Cloud: Optimize query computation2026-10-14
ドライランが構文の確認と処理量の見積もりを返し、スロットを使わず料金がかからないこと、行レベルのセキュリティの表では常に0バイト、外部データソースでは下限として0バイトが返ることがあることGoogle Cloud: Run a query2026-10-14
jobs.query の dryRun、totalBytesProcessed、maximumBytesBilled(上限を超えると料金がかからずに失敗)、useLegacySql の既定が true であることGoogle Cloud: Method jobs.query2026-10-14
INFORMATION_SCHEMA.COLUMNS の is_partitioning_column・clustering_ordinal_position、読むのに要る権限と役割Google Cloud: COLUMNS view2026-10-14
Apps Script の BigQuery 拡張サービスが有効化が要り、公開されている API と同じオブジェクト・メソッド・パラメータを使うことGoogle Apps Script: BigQuery Service2026-10-14
フォームの送信で動くインストール型トリガーがあり、作った人のアカウントで動くことGoogle Apps Script: Installable triggers2026-10-14
1回の実行が6分まで、Workspace のアカウントで URL Fetch が1日10万回、トリガーの合計実行時間が1日6時間であることGoogle Apps Script: Quotas2026-10-14
構造化出力を output_config.format で指定すること、refusal・max_tokens で終わるとスキーマに合わないことがあることClaude: Structured outputs2026-10-14

直した版を使うかどうかと、抜き出した数字が業務の定義として正しいかの判断は、データ担当と依頼者が行ってください。 本記事は上の公開情報で確認できた範囲だけを扱っています。

実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。

自社の業務に使えるAI活用候補を整理します

このユースケース(UC-1482)についてのご相談はこちらから。

AI活用について相談する
目次