Lookerでフィルタの選択値一覧の表示が遅い時の対処法

何かしら安心のサジェスションは無いかと悶え苦む現代の児
2020.01.20

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

大阪オフィスの玉井です。何気に2020年初投稿です。何という体たらくか。

Lookerのフィルタの選択値表示が遅い問題

LookerでLookやダッシュボードを作ったことがあれば、最低でも1回はフィルタを使ったことがあると思います。表示するデータを絞り込むものですが、まあ大体のダッシュボードにはつけるのではないでしょうか。

で、Lookerのフィルタってのは、使おうとすると、選択できる値の一覧を表示してくれます。

Changing Filter Suggestionsより

この表示は、どういう仕組みで動いているのかという話なのですが、裏で下記のクエリが実行されています。

SELECT DISTINCT <フィルタに使用する項目> FROM <テーブル名> LIMIT 1000

シンプルですね。要するにフィルタに使用するcolumnのユニーク値を最大1000件とってきています。

これの何が問題なのかというと、単純にデータが多い場合、フィルタの選択値表示自体が遅くなるという問題があります。ダッシュボードを見る側にとって、フィルタを選ぼうとするだけでいちいち待たされるとストレスも溜まりますし、最悪そのダッシュボード自体見られなくなるおそれもあります。見られなくなったダッシュボードは無用の長物と化し、データ分析そのものがストップしてしまいます。そうなったらそれはもう立派な機会損失(データ分析で得られたかもしれない利益が得られなくなる)です。

↑このグルグルが終わらない時、ありますよね。

ですので、フィルタの選択値の表示が遅いと感じられる場合は、別途対策を打つ必要があります。

対処法

こちらのディメンション(を使ったフィルタ)に対して色々と試してみます。

  dimension: brand {
    label: "ブランド名"
    ...
    (略)

フィルタの選択値の表示(filter suggestions)をOFFにする

一番シンプルな方法です。時間がかかる処理があるのであれば、それ自体を切ればいいのです。

suggestableを使います。ディメンションにこのオプションを指定することで、「選択値の表示」そのものをオン・オフすることができます。

やってみた

  dimension: brand {
    label: "ブランド名"
    suggestable: no
    ...
    (略)

注意点

フィルタで待たされるストレスは無くなりますが、そのフィルタでどんな値が選べるのか分からなくなります(直接入力のみとなるため)。使われているデータに詳しくない人の場合、そもそもフィルタ自体を使うことができなくなるおそれがあります。この方法を使う場合は、そのフィルタで選べる値のリストを別途共有する等の工夫が必要になると思います。

表示するフィルタの選択値を制限する

これもシンプルですね。フィルタに表示する値が多いほど時間がかかるのであれば、表示する値を制限してしまえばいいのです。

suggestionsを使います。これは、フィルタに表示する選択値をベタ書きで指定することができます。

やってみた

  dimension: brand {
    label: "ブランド名"
    suggestions: ["180s","1826"]
    ...
    (略)

注意点

使われているデータに詳しくない人の場合、「そのフィルタにはこれらの値しか選べない」と誤解する可能性があります(他の値も直接入力すれば使用できる)。フィルタで選べる値のリストを別途共有する等の方法もありますが、この方法を使う場合は、そもそも「このダッシュボードでフィルタリングに使用する値はこれらだけ」みたいな明確な要件がある場合に留めたほうがいいかもしれません。

suggest_dimension (とsuggest_explore)を使用する

上2つの方法よりかは若干テクいやり方になります。

suggest_dimension

簡単にいうと、フィルタの選択値を別dimension(別カラム)の値に代替することができます。あくまで選択値なので、実際にその値でフィルタリングがかかるのは、そのダッシュボードに使われているデータとなります。

suggest_explore

suggest_dimension とセットで使う感じになります。suggest_dimension で代替用に使うディメンションを指定しますが、そのディメンションが別Explore(ざっくりいうと別テーブル)に存在する場合、suggest_exploreでexplore名を指定することで、そのexploreにあるディメンションを選択値に代替することができます。

やってみた

あえてブランド名とは全く関係ないディメンションを使用します(効果がわかりやすいため)。

  dimension: brand {
    label: "ブランド名"
    suggest_explore: order_items
    suggest_dimension: order_items.status
    ...
    (略)

ブランド名のフィルタですが、「ステータス」を代替の選択値として指定しているため、下記のようになります。

利点

ダッシュボードの対象データがファクトテーブル等で、データ量が大量にある場合、そこからフィルタの選択値を出すのは非常に時間がかかります。

そこで、フィルタ選択値用の別テーブル等を用意し、そこのディメンションを代替値として使用することで、フィルタの選択値の表示を早くすることができます。

注意点

フィルタ選択値用に別途テーブルを用意しなければいけないのが面倒です。また、フィルタ同士を関連させている場合(地方で「関西」を選んだら、フィルタできる都道府県も2府4県に限定される的な)、フィルタとテーブルの兼ね合いも考慮しないといけません。

おわりに

昨今、ダッシュボードで分析する対象データの量はますます増えてきています。同テーブルからフィルタの選択値を毎回出していては時間がかかってしょうがないので、要件と照らし合わせて最適な方法を検討してみましょう。

参考資料