■Lookerのキャッシュについて
Lookerでは、新たなクエリを実行しようとするとまず、Looker内に有効なキャッシュがあるかどうかを確認します。有効なキャッシュがある場合は、DBにクエリせずにキャッシュの結果を使用してdashboardやexplore、スケジューラーの結果が表示されます。
有効なキャッシュがない場合に初めて、DBにクエリが発行され、その結果は設定した時間だけキャッシュされます。
クエリの結果はデフォルトで1時間Lookerにキャッシュされますが、キャッシュの有効時間を変更するには、LookMLでpersist_forパラメーターやdatagroupパラメーターを使用します。
Lookerのキャッシュについて詳しくはこちらのドキュメントをご確認ください。
キャッシュの機能をうまく使用すると、DBへ投げるクエリの数を減らしたり、実行に時間がかかるクエリの表示にキャッシュを使用することでダッシュボードを開いたときに早く結果を表示したりすることができます。
■クエリとキャッシュのログを確認しながら仕組みを理解する
exploreやdashboardの実行時に、キャッシュされた結果を表示したのか、DBに投げたクエリの結果を表示したかのログは、System ActivityのHistory Exploreで確認できます。System Activityは、Admin権限またはsee_system_activityのpermissionを付与されたユーザーが閲覧可能です。
それでは実際にクエリのログを確認してみましょう♪
Explore > System Activity > History のExploreを開いて、画像にあるフィールドを選択していただくとうまく情報を取得できます。
今回の例では、ログは下が古いもの、上が新しいものになるようにソートしています。
dashboardやexploreを実行すると、まず書き込まれたクエリの有効なキャッシュがないか確認します。(Attempted Cache = Yes)
しかし、有効なキャッシュがなかったため、DBにクエリを投げ、クエリの結果を表示しました。(Result Resource = query)
ブラウザを再読み込みしたり、dashboardの更新ボタンを押して更新しました。
1.で実行したクエリと全く同じクエリを再実行したことになるので、ログで表示されるQuery IDは同じになります。
この場合は、先ほど1.で実行したクエリと全く同じクエリを再度実行しようとしたので、1.で実行した際にキャッシュされたデータから結果を表示しています。
まず、有効なキャッシュがあるか確認し(Attempted Cache = Yes)、有効なキャッシュがあったので、キャッシュを使って結果を表示したのが確認できます。(Result Source = Cache)
ここで、キャッシュキーとしてRender keyとCache keyの2種類があるのがわかります。
二つの違いはあまり気にしなくて良いのですが詳しくはこちらに記載があります。
基本的にLookerが「キャッシュの結果を参照して XXしました」と言うとき、LookerはRender keyをみています。
schedulerでcsv, excelファイルなどのrenderを必要としないデータを実行した時はrender keyが生成されないので、その後に実行したクエリはDBにクエリすることになります。
キャッシュの有効期限が切れればキャッシュは無効になりますが、有効期限内に強制的にクリアしたい場合は、Clear Cache and Refreshを実行します。
dashboard, explore, lookの右上のメニュー中から実行できます。
Clear Cache and Refreshを実行すると、有効なキャッシュがあるか確認せずに(Attempted Cache = No)、DBにクエリしています。(Result Source = query)
スケジューラーでlookやdashboardを実行した際も、キャッシュの観点ではlookやdashboardを直接みているのと同じように動作します。
今回スケジューラーを実行した際は有効なキャッシュがあったので、キャッシュから結果を取得しているのが確認できます。
SQL Runnerでクエリを実行した際は、キャッシュを見ずに毎回DBに直接クエリを投げます。
SQL Runnerのクエリ履歴は、System ActivitのHistory Exploreでは1~4でみていたQuery IDがふられないので、新しくSQL Runner Query IDのフィールドを追加します。
1回目にSQL runnerを実行した後、2回目に実行した際も、キャッシュを確認せずに(Attempted Cache = No)直接クエリしている(Result Source = query)のが確認できます。
いかがでしたでしょうか。Lookerがどのようにキャッシュを利用しているかについて理解が深まりましたら幸いです!