見出し画像

BigQueryのガイドから学ぶ一時テーブルを活用したテーブル結合の効率化

みなさん、こんにちは!
今回の記事は今田が担当します。

本記事では、BigQueryでのテーブル結合におけるパフォーマンスを一時テーブルを活用することで最適化する方法を、BigQueryのガイドを参考にしながら解説します。


1.ガイドの引用文を紹介

引用1:複雑なクエリを分割することで、中間結果を変数または一時テーブルで実体化できます。
これらの中間結果はクエリの他の部分で使用できます。
これらの結果がクエリの複数の場所で必要な場合は、非常に便利です。
一時テーブルのストレージには課金されません。

引用2:一時テーブルを使用すると、中間結果をテーブルに保存できます。
この一時テーブルはセッションレベルで存在するため、データセット内での保存や管理の必要はありません。
複数ステートメント クエリで一時テーブルを作成して参照できます。
一時テーブルが不要になったら、手動で削除するか、BigQuery が 24 時間後に削除されるのを待ちます。


上記の引用文からわかるように、BigQueryで効率的なテーブル結合を実現するためには、以下のポイントが重要そうです。 

  1. 複雑なクエリを分割し、中間結果を変数または一時テーブルで処理を効率化する。

  2. 一時テーブルを活用して中間結果を保存し、他のクエリで参照する。


2.サンプルのSQLをもとに解説

それでは、具体的なサンプルのSQLをもとに、一時テーブルを活用したテーブル結合の手法を解説します。

SELECT *
FROM table1
JOIN table2 ON table1.id = table2.id
JOIN table3 ON table2.id = table3.id
JOIN table4 ON table3.id = table4.id;

このSQLでは、一時テーブルを活用せずtable1、table2、table3、table4の4つのテーブルを一度に結合しています。結合するテーブルの数が増えると、クエリの実行時間が長くなる可能性があります。
 
以下は、テーブル結合処理を分割して、1つのテーブルを結合して新しいテーブルを作成する操作を3回繰り返すサンプルSQLです。

-- ステップ1: table1とtable2を結合して新しいテーブルを作成
CREATE TABLE new_table1 AS
SELECT t1.id, t1.column1, t2.column2
FROM table1 AS t1
JOIN table2 AS t2 ON t1.id = t2.id;

-- ステップ2: new_table1とtable3を結合して新しいテーブルを作成
CREATE TABLE new_table2 AS
SELECT nt1.id, nt1.column1, nt1.column2, t3.column3
FROM new_table1 AS nt1
JOIN table3 AS t3 ON nt1.id = t3.id;

-- ステップ3: new_table2とtable4を結合して最終的なテーブルを作成
CREATE TABLE final_table AS
SELECT nt2.id, nt2.column1, nt2.column2, nt2.column3, t4.column4
FROM new_table2 AS nt2
JOIN table4 AS t4 ON nt2.id = t4.id;

このSQLでは、最初にtable1とtable2を結合してnew_table1を作成し、その後new_table1とtable3を結合してnew_table2を作成し、最後にnew_table2とtable4を結合してfinal_tableを作成しています。各ステップで一時テーブルを作成することで、クエリの効率を向上させることができます。
 
データ量が少ないテーブルの結合であれば、さほど処理時間が変わらないですが、
データマートを作成するときなど大規模なデータを扱う場合は、処理時間にも大きくかかわってきます。実務でも後者の方法に書き換えることで処理時間を短縮することができました。


3.まとめ

データベースクエリのパフォーマンスを最適化するためには、適切なテーブル結合の方法を選択することが重要です。
一方でクエリの書きやすさという観点では、一度に結合させるクエリの方が書きやすいと思いますので、状況に合わせて使い分けできるとよいのかなと個人的には思っています。
 
また本記事では詳しく紹介しませんでしたが、一時テーブルを活用することに以外にも、以下のようなことも有効だとガイドに紹介されています。

  • テーブルを結合する場合は、最大のテーブルから始める
    (大きいテーブルをJOINの左側に配置し、小さいテーブルをJOINの右側に配置する)

  • 結合は、INT型をできる限り使用する

実務で試行錯誤していきながら、参考になったことを今後も記事にして紹介できれと思います!
ではまた!

●●●

SMKT事業部では、データエンジニアを募集しています。是非こちらもご覧ください。

▽その他募集職種こちらから▽

●●●

✉ サービスに関するお問い合わせ
パーソルプロセス&テクノロジー SMKT事業部
smkt_markegr_note@persol-pt.co.jp


みんなにも読んでほしいですか?

オススメした記事はフォロワーのタイムラインに表示されます!