Skip to content

Instantly share code, notes, and snippets.

@terashim
Last active March 2, 2020 10:32
Show Gist options
  • Select an option

  • Save terashim/72d5d70ae9b0139a5b912c871dff55f4 to your computer and use it in GitHub Desktop.

Select an option

Save terashim/72d5d70ae9b0139a5b912c871dff55f4 to your computer and use it in GitHub Desktop.
BigQuery パーティショニングによるクエリサイズの削減実験

BigQuery パーティショニングによるクエリサイズの削減実験

パーティショニングされたテーブルに対してクエリを実行するとき, パーティショニングフィールドの値で絞り込むとデータ処理量を削減できる. しかし, サブクエリや他のテーブルを使って絞り込み条件を与えるとクエリサイズ削減が効かない.

ドキュメント パーティション分割テーブルのクエリ | BigQuery | Google Cloud より引用

述部フィルタはテーブルの識別子に可能な限り近いところに記述してください。述部(内部クエリやサブクエリなど)を解決するために複数の段階でクエリの評価を行う必要がある複雑なクエリでは、クエリからパーティションがプルーニングされません。

これについての実験を行った.

--
-- BigQuery パーティショニングによるクエリサイズの削減実験
--
-- パーティショニングされたテーブルに対してクエリを実行するとき,
-- パーティショニングフィールドの値で絞り込むとデータ処理量を削減できる.
-- しかし, サブクエリや他のテーブルを使って絞り込み条件を与えるとクエリサイズ削減が効かない.
--
-- 参考: https://cloud.google.com/bigquery/docs/querying-partitioned-tables#pruning_limiting_partitions
--
-- ### データの準備
--
-- 適当なプロジェクトで空のデータセット example を作成しておく.
--
-- サンプルデータとして、列dateでパーティショニングされたテーブルを作成.
-- サイズ: 55.74 MB
-- 行数: 3,653,000
-- となる.
CREATE TABLE `example.data` PARTITION BY date AS (
SELECT
date,
number
FROM
UNNEST(GENERATE_DATE_ARRAY('2016-01-01', '2025-12-31')) AS date
CROSS JOIN UNNEST(GENERATE_ARRAY(1, 1000)) AS number
);
-- 日付を保存したテーブルを作成
CREATE TABLE `example.today` AS (
SELECT
CURRENT_DATE('Asia/Tokyo') AS date
);
-- ### クエリの実験
-- 直接日付を指定して列dateで絞り込み.
-- パーティショニングによって処理量が削減される.
-- 処理量: 15.6 KB
SELECT
*
FROM
`example.data`
WHERE
date IN (DATE '2020-02-29');
-- CURRENT_DATE関数で日付を指定して列dateで絞り込み.
-- パーティショニングによって処理量が削減される.
-- 処理量: 15.6 KB
SELECT
*
FROM
`example.data`
WHERE
date IN (CURRENT_DATE('Asia/Tokyo'));
-- サブクエリの結果を用いて絞り込み.
-- パーティショニングによる処理量の削減が効かない.
-- 処理量: 55.7 MB
SELECT
*
FROM
`example.data`
WHERE
date IN (SELECT DATE '2020-02-29')
-- 別テーブルのデータで絞り込み.
-- パーティショニングによる処理量の削減が効かない
-- 処理量: 55.7 MB
SELECT
*
FROM
`example.data`
WHERE
date IN (SELECT date FROM `example.today`)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment