業務部門が書いたデータ抽出のSQLを、社内の命名規約とBigQueryの性能の観点で点検し、直した版と理由を返す
業務部門の担当者が書いたデータ抽出のSQLを、社内の命名規約と BigQuery の性能の観点で点検します。直した版のSQLと、直した箇所ごとの理由を、書いた本人とデータ担当に返します。
- 生成AI
- ChatGPT/Claude/Gemini
- 連携・自動化
- Google Apps Script
- 対象業界
- EC/IT・SaaS/小売/金融
- 対象部門
- 情報システム
- 対象業務
- 内容確認・チェック/書類作成
- 主な課題
- 人手が足りない/属人化している/確認ミスが多い
- AIで行う処理
- 校正
- 主な効果
- 品質標準化/工数削減/教育コスト削減
- 導入難易度
- ★★☆☆☆
- 実装レベル
- 半自動化
- 費用感
- API連携(中)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 業務部門の担当者が、BigQuery のコンソールでSQLを書いて試す
- 共有のフォームにSQLと目的(何に使うか、どの期間か)を書いて点検を依頼する
- データ担当がSQLを開き、読んでいる表と列、条件、結合を読み取る
- 社内の決まりに照らし、命名・別名・日付の扱いを見る
- 性能の観点で、読み込む列、パーティションの条件、結合の順、くり返し参照されるWITH句を見る
- 直した版を書き、ドライランで読み込む量を確かめる
- 直した箇所と理由を書いて、依頼者に返す
- 人業務部門の担当者が、共有のフォームにSQLと目的を書いて点検を依頼する
- 自動フォームの送信をきっかけにスクリプトが動き、SELECT文かどうかと、読んでいる表を取り出す
- 自動読んでいる表の列の一覧と、パーティション・クラスタの列を、BigQuery のメタデータから取る
- 自動元のSQLをドライランにかけ、構文の誤りと読み込む量を取る
- 自動Claude API が、命名規約と性能の観点の一覧に沿ってSQLを点検し、直した版と直しごとの理由を返す
- 自動直した版をドライランにかけ、構文と読み込む量を確かめる
- 自動結果が変わりうる直しを含むときは、短い期間で元のSQLと直した版を実行し、結果を突き合わせる
- 自動点検の結果を一覧に書き、データ担当に知らせる
- 人データ担当が、直しと突き合わせの結果を確かめ、依頼者に返す
各工程の詳しい説明を読む
- 業務部門の担当者が、BigQuery のコンソールでSQLを書いて試す
- 共有のフォームにSQLと目的(何に使うか、どの期間か)を書いて点検を依頼する
- データ担当がSQLを開き、読んでいる表と列、条件、結合を読み取る
- 社内の決まりに照らし、命名・別名・日付の扱いを見る
- 性能の観点で、読み込む列、パーティションの条件、結合の順、くり返し参照されるWITH句を見る
- 直した版を書き、ドライランで読み込む量を確かめる
- 直した箇所と理由を書いて、依頼者に返す
(a)見る人が限られて待ちが出る。 BigQuery の性能の勘どころが分かるのは3名だけです。依頼が集中する月初は、返すまでに3〜4日かかります。 待ちきれずに、点検を通さないまま定期のレポートに組み込まれるSQLが出ます。
(b)指摘の基準が人によって違う。 ある担当は別名の付け方まで直し、別の担当は性能だけを見ます。同じSQLでも、誰に当たるかで返ってくる直しが変わります。 依頼者から見ると、決まりがどこにあるのか分かりません。
(c)直しで結果が変わったことに気づかない。 性能のために条件の位置を動かし、外部結合が内部結合と同じ結果になる直しを返してしまうことがあります。直した側も依頼者も、件数が少し減ったことに気づかないまま使います。
(d)同じ直しを毎月くり返す。 直した理由を毎回手で書くので、短く済ませがちです。理由が伝わらないので、次の月も同じSQLが届きます。 教える機会を、点検のたびに逃しています。
- 【人】 業務部門の担当者が、共有のフォームにSQLと目的を書いて点検を依頼する
- 【自動】 フォームの送信をきっかけにスクリプトが動き、SELECT文かどうかと、読んでいる表を取り出す
- 【自動】 読んでいる表の列の一覧と、パーティション・クラスタの列を、BigQuery のメタデータから取る
- 【自動】 元のSQLをドライランにかけ、構文の誤りと読み込む量を取る
- 【自動】 Claude API が、命名規約と性能の観点の一覧に沿ってSQLを点検し、直した版と直しごとの理由を返す
- 【自動】 直した版をドライランにかけ、構文と読み込む量を確かめる
- 【自動】 結果が変わりうる直しを含むときは、短い期間で元のSQLと直した版を実行し、結果を突き合わせる
- 【自動】 点検の結果を一覧に書き、データ担当に知らせる
- 【人】 データ担当が、直しと突き合わせの結果を確かめ、依頼者に返す
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 |
| 保管 | 点検の一覧(スプレッドシート)と、入出力のJSON | BigQuery の記録用の表 |
データ基盤も社内の決まりも、新しく足すものではありません。 足すのは、フォームの送信で動くスクリプトと、社内の決まりを点検の観点の一覧に書き直した文書です。共有ドキュメントの決まりは文章で書かれているため、1項目ずつ番号を振った一覧にします。
点検の観点のうち、性能の側は BigQuery の公式のベストプラクティスに沿います。 公式には、必要な列だけを読むこと、**SELECT * に LIMIT を付けても読み込む量は変わらないこと、パーティションの列で絞ること、結合の前に集計して量を減らすこと、行数の多い表を先に置くことなどが挙げられています。WITH句は参照のたびに評価されうる**ので、何度も参照する重い計算は一時テーブルに落とすよう案内されています。
読み込む量の確かめには、ドライランを使います。 ドライランはクエリを実行せず、構文の確認と処理される量の見積もりを返し、スロットを使わず料金もかかりません。 ただし、行レベルのセキュリティがかかった表では常に0バイトが返り、外部データソースへのクエリでは下限として0バイトが返ることがあります。 この2つは読み込む量の比較に使えないので、印を付けて人に回します。
03どうやって実装するのか
処理の起点を決める
共有のフォームの送信を起点にします。 Google Apps Script のインストール型トリガーには、フォームの回答の送信で動くものがあります。インストール型トリガーは、作った人のアカウントで動きます。 個人のアカウントで作ると、その人が異動したときに止まり、BigQuery への権限もその人のものになります。データ基盤チームの共有の作業用アカウントで作ります。
1回の送信で1本のSQLを点検します。複数のSQLを1回の依頼にまとめさせません。 まとめると、どの直しがどのSQLのものか分からなくなります。フォームの項目は、SQL本文、目的(何に使うか)、想定する期間、定期のレポートに組み込むかどうか、の4つです。
Apps Script の1回の実行は6分までです。点検と突き合わせが6分に収まらないSQLは、突き合わせを後回しの実行に分けます。 一覧に「突き合わせ待ち」と書き、時間主導型のトリガーで続きを動かします。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| SQL本文 | 依頼者が書いたSELECT文 | フォームの回答 |
| 目的と期間 | 何に使うか、どの期間のデータか、定期のレポートに組み込むか | フォームの回答 |
| 表の情報 | 読んでいる表の列の名前と型、パーティションの列、クラスタの列の順 | BigQuery の INFORMATION_SCHEMA.COLUMNS |
| ドライランの結果 | 構文の誤りの有無、処理される量 | BigQuery のドライラン |
| 点検の観点の一覧 | 命名規約(N-01〜)と性能の観点(P-01〜)の番号付きの項目 | データ基盤チームが作る文書 |
質を決めるのは、3行目と5行目です。 表の情報が無いと、AIはどの列がパーティションの列かを推測し、実在しない列の名前で条件を書きます。 観点の一覧が無いと、AIは一般的なSQLの書き方で直し、社内の決まりと違う直しを返します。
目的と期間は、性能の直しの判断に使います。 「直近3か月の店舗別の売上」が目的なら、日付の条件が無いSQLは全期間を読んでいることになります。目的に書かれていない期間の条件を、AIが足すことはさせません。 足すべきかを指摘し、足すかは依頼者が決めます。
データの取得方法を決める
| 取るもの | 方法 | 注意 |
|---|---|---|
| 読んでいる表 | 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番目の突き合わせのときだけです。
AIへ渡す前に整形する
- SELECT文かの確認 … 先頭が
SELECTかWITHで、INSERT・UPDATE・DELETE・MERGE・CREATE・DROPを含まないことを確かめます。含むものは点検せずに返します - コメントの扱い …
--と/* */のコメントは残します。依頼者の意図が書かれていることが多いからです - 表の名前の取り出し … プロジェクト・データセット・表の3つに分け、WITH句の名前を除きます
- 元のSQLのドライラン … 構文の誤りがあれば、点検の前に誤りの文を依頼者に返します
- 読み込む量の記録 … 元のSQLの処理される量を記録します。直した版との比較の基準になります
- 0バイトの印 … 行レベルのセキュリティがかかった表や外部データソースを読むSQLで0バイトが返ったら、印を付けます
- 表の情報の圧縮 … 列が多い表は、SQLで使っている列と、パーティション・クラスタの列だけに絞って渡します
1番目をAIに任せずにプログラムで行うのが要点です。 更新を含むSQLを点検の流れに入れると、7番目の突き合わせで更新が実行されてしまいます。 正規表現で弾き、迷うものは点検しません。
4番目で構文の誤りを先に返すのも、同じ理由です。 動かないSQLをAIに渡すと、AIは誤りを直したうえで性能の直しを重ね、どこが構文の直しでどこが性能の直しか分からない版が返ります。
AIに処理させる
させるのは、観点の一覧に沿って問題を拾い、直した版を書き、直しごとに観点の番号と理由と「結果が変わりうるか」を付けることです。
| 観点の種類 | 例 | 結果が変わりうるか |
|---|---|---|
| 命名(N) | WITH句の名前を処理の内容が分かる名前にする、別名を表の略称にそろえる、出力の列の名前をスネークケースにする | 変わらない(出力の列の名前を変えたときは、後ろの処理への影響を書く) |
| 読み込む列(P-01) | SELECT * を使う列だけに絞る | 出力の列が減るので変わる |
| パーティション(P-02) | パーティションの列で期間を絞る | 期間が変われば変わる |
| 結合(P-03〜) | 結合の前に集計する、行数の多い表を先に置く、自己結合をウィンドウ関数にする | 書き方によって変わる |
| WITH句(P-06) | 何度も参照する重い計算を一時テーブルに落とすことを勧める | 変わらない |
3列目の印が、この構成でいちばん大事な区別です。 印が「変わる」「書き方によって変わる」の直しを含むときだけ、7番目の突き合わせを動かします。命名の直しだけなら突き合わせは要りません。
| させないこと | 理由 |
|---|---|
| 業務の定義の変更 | 売上に返品を含めるか、どの店舗を対象にするかは業務部門が決める |
| 目的に無い期間の条件の追加 | 期間を決めるのは依頼者。足すべきかの指摘にとどめる |
| 表の情報に無い列の使用 | 実在しない列の名前で直さない |
| 更新・作成の文の提案 | 点検の対象はSELECT文だけ |
| 「結果は同じ」という結論 | 同じかどうかは突き合わせで確かめる |
5行目がいちばん起きやすい失敗です。 書き換えた理由に「結果は変わりません」と添えるのは自然な書き方ですが、その一文を信じて突き合わせを省くと、第3章の(c)がそのまま起きます。
指示内容を固定する
あなたは社内のデータ基盤チームで、業務部門の担当者が書いた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 の文字列があるかを確かめ、見つからない直しは一覧から外して印を付けます。
出力形式を固定する
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の列の並びに合わせて直した版を包み直します。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 共有のフォーム | Apps Script のインストール型トリガー | 依頼の受け付け |
| BigQuery | Apps Script の拡張サービス(jobs.query) | メタデータ、ドライラン、突き合わせの実行 |
| Claude API | UrlFetchApp から Messages API | 点検と直した版の作成 |
| 点検の一覧 | スプレッドシートへの追記 | 区分、直し、読み込む量の比較 |
| データ担当 | Google Chat またはメール | 「要確認」「差し戻し」を先に知らせる |
Apps Script の UrlFetchApp は、Google Workspace のアカウントで1日10万回まで呼べます。月240件の点検なら上限に届きません。 トリガーの合計の実行時間は1日6時間までで、1件の点検は数十秒で終わる想定です。
依頼者への返却は、データ担当が一覧の行から送ります。 返す文面には、直した版、直しごとの理由と観点の番号、読み込む量の変化(例:元 820GB → 直した版 36GB)、notes の問いを並べます。読み込む量の変化を数字で返すと、依頼者が直しを受け入れる理由になります。
人が確認する
- 「要確認」と「差し戻し」を先に見る … 突き合わせで差が出たものは、どの直しが差を生んだかを見ます
result_may_changeが true の直しを読む … 差が0行でも、1日分では出なかっただけの可能性があります。月末や祝日の条件に関わる直しは、別の日でも突き合わせますnotesの問いを確かめる … 期間の条件や業務の定義の疑問は、依頼者に聞く形で返します- 命名の直しは流し見る … 出力の列の名前を変えた直しは、後ろのスプレッドシートやレポートが列の名前で参照していないかを依頼者に確かめます
- AIの直しを覆したら記録する … 観点の一覧の書き方を直す材料にします
2番目を省かないでください。 1日分の突き合わせで差が0行でも、月をまたぐ条件や、特定の曜日にしか無いデータでは差が出ることがあります。 突き合わせは「差が無いことの証明」ではなく、「差があることを見つける網」です。
目標は、240件をならして1件5分です。 「返却可」は直しを流し見て返し、「要確認」に時間を使います。
例外に対処する
| 起きること | 対応 |
|---|---|
| SELECT文でない | 点検せず、「点検の対象外」と依頼者に返す |
| 元のSQLが構文の誤り | ドライランの誤りの文を返し、直してから出し直してもらう |
| 読んでいる表の権限が点検用のアカウントに無い | 「要確認」。データ担当が権限の付与かを判断する |
| 0バイトが返った(行レベルのセキュリティ・外部データソース) | 読み込む量の比較をせず、「要確認」 |
before が元のSQLに見つからない | その直しを外し、「要確認」 |
突き合わせが maximumBytesBilled で止まる | 期間をさらに短くするか、突き合わせを人に回す |
| 6分を超えそう | 突き合わせを後回しの実行に分ける |
構造化出力が refusal や max_tokens で終わる | 受け付けず、max_tokens を上げて再実行。続けば人へ |
記録を残す
- 依頼の日時、依頼者、SQL本文、目的と期間
- 渡した表の情報と、そのときの観点の一覧の版
- 元のSQLと直した版のドライランの結果(処理される量)
- Claude API の出力の全文と、照合で外した直し
- 突き合わせの条件(日付)と、双方向の差の行数
- データ担当の最終の判断、覆した直し、依頼者に返した日時
観点の一覧の版を残すのは、決まりが後から変わるためです。 命名の決まりを変えると過去の直しの意味が変わり、当時の決まりが残っていないと、なぜその直しをしたかが追えません。
依頼者ごとの指摘の多い観点も、月に1回数えます。 同じ観点で毎月直されている人には、点検で返すより、短い勉強会で伝えたほうが早く減ります。
04実装レベルの3段階
半自動化で、1件15分が5分になり、この段階が本記事の想定です。 データ担当の手元に残るのは、直しと突き合わせの結果を確かめて返す作業です。 本格構成は、点検を通さずに組み込まれるSQLを無くすための段階です。 時間は大きく変わりませんが、第3章の(a)で待ちきれずに組み込まれていたSQLが、点検の外に出なくなります。 スケジュールされたクエリの一覧を毎日引き、点検の記録に無いSQLを知らせる形が考えられます。 段階を飛ばさないでください。 半自動化の1か月で、観点の一覧の書き方のあいまいさと、突き合わせで差が出やすい直しの型が分かります。
05工数削減シミュレーション
導入後 240件 × 5分 ÷ 60 = 20 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- BigQuery にデータ基盤を置き、営業企画・マーケティング・店舗運営などの業務部門の担当者が自分でSQLを書いてデータを抜き出している会社。定期のレポートに組み込む前や、大きな表を読む前に情報システムのデータ担当がSQLを見ているが、見る人が2〜3名に限られて待ちが出ている場合。社内のSQLの書き方の決まり(命名・別名・日付の扱い)を文書にできる場合。
- 業務部門がSQLを書かず、抽出はすべて情報システムが行っている場合。更新・削除・テーブルの作成を伴うSQLの点検(実行前の安全確認は別の仕組みが要ります)。表の名前や列の名前そのものが外部に出せない情報に当たり、生成AIのAPIに送ることが社内の規程で認められていない場合。なお、抜き出した数字が業務の定義として正しいか(売上に返品を含めるか等)の判断は、この構成では代替できません。
07最小構成で試す方法
- 過去2か月に点検したSQLから20本を選ぶ(直したら結果が変わってしまった例を含める)
- 社内のSQLの書き方の決まりを、番号付きの観点の一覧(N-01〜、P-01〜)に書き直す
- 1本ずつ、読んでいる表の列の一覧とパーティションの列を手で書き出す
- 手元のAIサービスに、観点の一覧・SQL・表の情報を渡し、「一覧の項目に当たる直しだけをしてください。直しごとに番号と理由を書き、結果が変わりうるかを書いてください。結果は変わりませんと書かないでください」と指示する
- 出てきた直しを、当時データ担当が返した直しと比べ、直した版をコンソールでドライランにかける
| 出てきた内容 | 判断 |
|---|---|
| 当時の担当と同じ直しが出て、ドライランが通った | スクリプトでつなぐ |
| 一覧に無い好みの直しが混ざる | 指示と観点の一覧の書き方で直る。構成は有効 |
| 結果が変わる直しに印が付かない | 突き合わせを必ず入れる前提で進める |
3行目が出ても、やめる理由にはなりません。 第7章で突き合わせを機械で行うのは、AIの印を当てにしないためです。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 直しで結果が変わる | result_may_change に頼らず、性能の直しを含むときは突き合わせる |
| 「結果は変わりません」と書く | 指示で禁じる。書かれていても突き合わせは省かない |
| 実在しない列で直す | 表の情報を渡し、直した版のドライランで弾く |
| ドライランが構文の誤りを返す | useLegacySql: false を指定しているかを先に見る |
| 0バイトが返る | 行レベルのセキュリティ・外部データソースの印を付け、比較しない |
| 更新を含むSQLが流れる | 前処理で弾く。点検のアカウントに書き込みの権限を持たせない |
| トリガーが止まる | 個人のアカウントで作らない。共有の作業用アカウントで作る |
| 好みの直しが混ざる | 観点の一覧に無い rule_id の直しを受け付けない |
| 出力の列の名前を変えて後ろが壊れる | 列の名前の直しは、参照先の確認を依頼者に求める |
上の2行が、この構成の失敗のほとんどです。 どちらも、AIが結果の同一性を保証できると扱ったときに起きます。同一性は、実行して数えるものです。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: SQL本文、表と列の名前と型、ドライランの処理量、突き合わせで数えた差の行数です。表の中身(売上・会員の値)は Claude API に送りません。
- 送るのはSQLとメタデータだけにする … 突き合わせの結果は行数だけを扱い、差の行そのものを AI に渡しません
- SQLのコメントや条件の値に個人の情報が無いかを見る … 特定の会員番号やメールアドレスを条件に書いたSQLは、値を伏せてから送るか、点検の対象外にします
- 点検用のアカウントの権限を絞る … メタデータの閲覧と、突き合わせに要る表の読み取りだけにし、書き込み・表の作成の権限を持たせません
- 突き合わせに料金の上限を付ける …
maximumBytesBilledを必ず指定し、上限を超えたら止まるようにします - 直した版を自動で組み込まない … 返すのは直した版の案までで、定期のレポートに組み込むのは依頼者とデータ担当の判断です
- 表と列の名前の扱いを規程で確かめる … 表の名前に取引先名や施策名が入っているときは、外部の 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技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
必要な列だけを読むこと、SELECT * に LIMIT を付けても読み込む量は変わらないこと、パーティションで絞ること、結合の前に集計すること、行数の多い表を先に置くこと、WITH句が参照のたびに評価されうること、自己結合の代わりにウィンドウ関数を使うこと | Google Cloud: Optimize query computation | 2026-10-14 |
| ドライランが構文の確認と処理量の見積もりを返し、スロットを使わず料金がかからないこと、行レベルのセキュリティの表では常に0バイト、外部データソースでは下限として0バイトが返ることがあること | Google Cloud: Run a query | 2026-10-14 |
jobs.query の dryRun、totalBytesProcessed、maximumBytesBilled(上限を超えると料金がかからずに失敗)、useLegacySql の既定が true であること | Google Cloud: Method jobs.query | 2026-10-14 |
INFORMATION_SCHEMA.COLUMNS の is_partitioning_column・clustering_ordinal_position、読むのに要る権限と役割 | Google Cloud: COLUMNS view | 2026-10-14 |
| Apps Script の BigQuery 拡張サービスが有効化が要り、公開されている API と同じオブジェクト・メソッド・パラメータを使うこと | Google Apps Script: BigQuery Service | 2026-10-14 |
| フォームの送信で動くインストール型トリガーがあり、作った人のアカウントで動くこと | Google Apps Script: Installable triggers | 2026-10-14 |
| 1回の実行が6分まで、Workspace のアカウントで URL Fetch が1日10万回、トリガーの合計実行時間が1日6時間であること | Google Apps Script: Quotas | 2026-10-14 |
構造化出力を output_config.format で指定すること、refusal・max_tokens で終わるとスキーマに合わないことがあること | Claude: Structured outputs | 2026-10-14 |
直した版を使うかどうかと、抜き出した数字が業務の定義として正しいかの判断は、データ担当と依頼者が行ってください。 本記事は上の公開情報で確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-1482)についてのご相談はこちらから。
