Upgrade to Pro — share decks privately, control downloads, hide ads and more …

〜基礎から発展まで〜 BigQuery×Looker Studio のクエリコスト削減方法!

〜基礎から発展まで〜 BigQuery×Looker Studio のクエリコスト削減方法!

Avatar for CUEBiC Inc.

CUEBiC Inc.

May 02, 2025
Tweet

More Decks by CUEBiC Inc.

Other Decks in Technology

Transcript

  1. BigQueryのベストプラクティス対応_パーティション 5 パーティション 日付単位で分割することで、指定期間のデータしかスキャンしなくなる ▷未設定の場合はWHERE句でBETWEEN句などを指定したとしてもフルスキャン SELECT * FROM `project.dataset.table` WHERE

    event_date = '2024-04-01' ❌ パーティションなし ✅ 日付パーティションあり 全データ (例:100GB)がスキャン対象 (WHERE句は後から適用) 1日分のデータのみスキャン (例:300MB)ス キャン量が大幅に削減 共通のクエリを実行した場合
  2. BigQueryのベストプラクティス対応_クラスタリング 6 クラスタリング ブロック単位で設定することでテーブルを効果的にソートする ▷RDBでいうところのINDEXの設定に感覚としては近い。 SELECT * FROM `project.dataset.events` WHERE

    user_id = 'abc123' ❌ クラスタリングなし ✅ クラスタリングあり 全データがスキャン対象となりスキャン量が 多く、速度劣化に user_idの値がまとまって格納されている の で、該当ブロックのみをスキャンして高速&低コ ストに 共通のクエリを実行した場合
  3. イメージ 12 https://lookerstudio.google.com/u/0/r eporting/54fa38e1-b459-4606-9a20-d863 59802901/page/p_mnpnn34ynd?params={"d s76.organization_param":"組織B"} SELECT campaign_id, campaign_name, ad_group_id,

    ad_group_name, impressions, clicks, cost, revenue, revenue / NULLIF(cost, 0) AS roas FROM your_dataset.your_table WHERE organization= @organization_param ORDER BY roas DESC 組織はデフォルト値 クエリストリングでデ フォルト値を更新 データソースを再集計 組織A 組織B
  4. INFORMATION SCHEMAから取得する 16 BigQuery フィルタ結果 SELECT DATETIME(creation_time, "Asia/Tokyo") AS creation_time_jst,

    -- クエリ作成日時 referenced_tables, -- 参照されたテーブル job_id, -- BigQueryのジョブ ID job_type, statement_type, (SELECT l.value FROM UNNEST(labels) l WHERE l.key = "looker_studio_report_id") AS report_id, -- Looker Studioのレポート ID (SELECT l.value FROM UNNEST(labels) l WHERE l.key = "looker_studio_datasource_id") AS datasource_id, -- データソース ID user_email, -- 実行ユーザー cache_hit, -- キャッシュ使用の有無 query, -- 実行クエリ total_bytes_billed / (1024*1024*1024) AS total_gb_billed, -- 請求データ量 (GB) total_slot_ms / 1000 AS total_slot_seconds -- スロット使用時間 (秒) FROM `region-asia-northeast1`.INFORMATION_SCHEMA.JOBS WHERE DATE(creation_time, "Asia/Tokyo") BETWEEN DATE_SUB(CURRENT_DATE("Asia/Tokyo"), INTERVAL 1 DAY) AND DATE_SUB(CURRENT_DATE("Asia/Tokyo"), INTERVAL 0 DAY) -- 昨日分のクエリ AND (SELECT l.value FROM UNNEST(labels) l WHERE l.key = "requestor") = "looker_studio" -- Looker Studioのクエリに限定 ORDER BY creation_time_jst DESC;