【Dataiku】SQL pipelinesでフロー実行時間を短縮してみた
はじめに
Dataikuでフローを作っていると、レシピをつなげるたびに中間データセットがどんどん増えていく…しかも処理時間も気づけば長くなっている。そんな経験はないでしょうか?
Dataikuにはこの問題を解決するための仕組みとして、「SQL Pipelines」 という機能があります。同じデータベース接続上で連続したレシピをまとめて1本のSQLとして実行してくれるため、データの書き込み・読み込みを最小限に抑えることができます。
今回は、SQL pipeplinesを有効にすることで本当にフローの実行が速くなるのか?
実際に検証してみました。
SQL pipelinesとは?
概要(公式ドキュメント)はこちら
通常、Dataikuでは各レシピが「入力データセットを読み込み → 処理 → 出力データセットを書き出す」というサイクルで動作します。
SQL pipelinesを使わない場合、各レシピごとに毎回Snowflake上に中間テーブルが作成されますが、
SQL pipelinesを有効にすると、これらの処理をまとめて1つのSQLクエリとしてSnowflakeに送ることで、中間データの書き込み/読み込みをスキップでき、フローの実行時間が短縮できるという仕組みのようですね。
注意事項
サポートされているデータベースはこちら
※S3等のストレージに保存しているケースでは使用できないことにご注意ください。
- Snowflake
- Databricks
- Redshift
- BigQuery
- Synapse
- SQL Server
- PostgreSQL
- MySQL
- Oracle
- Greenplum
- Teradata
- Vertica
また、使用できないレシピも一部あるのでこちらをご確認ください。
検証環境
| 項目 | 内容 |
|---|---|
| DSSバージョン | 14.2.0 |
| 接続先 | Snowflake |
| Warehouseサイズ | X-SMALL |
| 対象データ | 約600万行のサンプルデータ(20列程度)※ |
※Snowflakeトライアル環境に用意されているテーブルを今回は使用しました

※Dataikuのフローは以下のとおり。(取り急ぎ作ったのでレシピの構成については突っ込まないでください)

設定方法
こちらの公式ドキュメントをご覧ください。
画像もあるので非常にわかりやすいのですが、補足するならば中間テーブルとなるデータセットの設定は対象全てに必要なのでお忘れなきようご注意ください。
※以下フローの場合は赤枠のデータセット全てに設定が必要です。

検証
Python等を使用すれば厳密な時間は確認できるのかもしれませんが、今回はざっくり検証します。
※画像内ではZoneの名前が変更されていますが、同じレシピ・データセットを使用しており上記設定のON/OFFのみ行っています。
SQL pipelines設定なし

データセットが空の状態から実行してみると、実行時間は31秒程度。
では念のためにSnowflake側のテーブルやクエリについても見てみましょう。


実際に3つの中間テーブルが作成されていますね。
クエリを確認すると、それぞれの中間テーブルへのInsertで時間がかかっているのが分かります。
SQL pipelines設定あり

データセットが空の状態から実行してみると、実行時間は12秒程度。
先ほどよりもかなり短い時間で実行できました。Snowflake側のテーブルやクエリについて見てみると…


ちゃんと中間テーブルは作成されていません。
クエリを確認すると、中間ビューが作成され(青枠箇所)最終テーブルにのみInsertされています。SQL pipelinesで時間が短縮されているのは、このInsertの回数を少なく留められているということが分かりますね。
おわりに
今回は短いフローでしたが、意外にもはっきり差が出たように思います。
より長いフローであるほど実行時間の短縮が見込める機能ではないかと感じました。
「Dataikuのフロー実行時間を抑えたい」「中間データセットをできるだけ減らしたい」
そんな方は、ぜひ一度SQLパイプラインを試してみてはいかがでしょうか。
Discussion