はじめに
最近業務でRedashを触っていて、今まで知らなかった機能に気づいたので紹介します。
それが Query Results という機能です。
Query Resultsとは
Query Resultsは、Redash上で作成したあるクエリの実行結果を、別のクエリの中でテーブルのように扱える機能です。
Redashでは、クエリを作成すると必ず一意のIDが振られます。このIDを使うことで、あるクエリの結果を、まるでデータベースの1つのテーブルであるかのようにSQLで参照できるようになります。
しかも面白いのは、参照先のクエリが元々使っていたデータソースと、今書いているクエリのデータソースが違っても構わないという点です。例えば「MySQLの結果」と「BigQueryの結果」をJOINする、といったこともできてしまいます。
基本の書き方:query_{queryID}
使い方はシンプルで、query_{queryID} という名前をテーブル名の代わりに書くだけです。
SELECT a.name, b.category
FROM query_100 AS a
JOIN query_500 AS b
ON a.id = b.id
これは、IDが 100 のクエリの結果と、IDが 500 のクエリの結果をJOINしている例です。
ここでポイントなのが、query_100 と書いた場合は参照先のクエリが実際に(再)実行されるという点です。つまり、参照元のクエリを実行するたびに、参照先のクエリも毎回走ることになります。
キャッシュを使う:cached_query_{queryID}
参照するたびに毎回クエリが実行されると、当然ながら実行時間がかかりますし、BigQueryのようなスキャン量課金のデータソースだと、その分コストもかかってしまいます。
そこで登場するのが cached_query_{queryID} という書き方です。
SELECT a.name, b.category
FROM cached_query_100 AS a
JOIN cached_query_500 AS b
ON a.id = b.id
query_ の部分を cached_query_ に変えるだけで、参照先のクエリを再実行せず、直近の実行結果(キャッシュ)を使うようになります。
これにより
- クエリの実行時間が短縮される
- BigQueryなど従量課金のデータソースであれば、余計なスキャンが発生せずコスト削減になる
というメリットがあります。
query_ と cached_query_ は混在できる
もう1つ地味に便利なのが、この2つの書き方は1つのクエリの中で混在させられるという点です。
SELECT a.name, b.category
FROM query_100 AS a
JOIN cached_query_500 AS b
ON a.id = b.id
「片方は常に最新の状態で見たいけれど、もう片方はマスタ的なデータであまり変わらないのでキャッシュで十分」といったケースで使い分けができます。
まとめ
- Redashには Query Results という、クエリの結果を別のクエリから参照できる機能がある
-
query_{queryID}と書くと、参照先のクエリが実行され、その結果をテーブルとして使える -
cached_query_{queryID}と書くと、直近の実行結果(キャッシュ)を使うため、高速化やコスト削減につながる -
query_とcached_query_は同じクエリ内で混在させることも可能
異なるデータソース同士のデータを組み合わせて集計したいときに、地味に強力な機能だと思うので、知らなかった方はぜひ試してみてください。