一行追加するだけでデータの取り込みを高速化するBufferプレフィックス

一行追加するだけでデータの取り込みを高速化するBufferプレフィックス

Pocket

今回はQlikViewやQlik Senseの隠れた良機能である、Bufferプレフィックスをご紹介します。
Bufferプレフィックスを使うと、ごく簡単な指定を追加するだけで、データの取り込みを高速化できます。
用途が限定的なためか、ほとんど使われていないように感じますが、うまく使えば開発効率が大幅に向上しますので、ぜひこの記事で使い方を学んでください。

Bufferプレフィックスは、内部的にQVDファイルという仕組みを使っています。
この記事は、QVDファイルについてご存じなくても理解できるように書いたつもりですが、先にQVDファイルについて知っておいた方がより理解が進みます。
前回の記事をご覧になっていない方は、ぜひ先に前回の記事をご覧ください。
大量データを超高速に読み込むQVDファイルの使い方


Bufferプレフィックスとは

Bufferプレフィックスとは、簡単に言うと読み込んだデータをローカルにキャッシュする機能です。
一度読み込んだデータはローカルに保存され、二度目以降はローカルのファイルからデータを読み込みます。

さらにこのときローカルに保存されるデータは、QlikViewとQlik Sense用に最適化された、QVDファイルという独自形式のファイルです。
QVDファイルからのデータの読み込みは非常に高速であるため、二度目以降のリロード処理は非常に高速におこなわれます。


Bufferプレフィックスの特徴

Bufferプレフィックスは、”プレフィックス(prefix:前につける)”の名のとおり、LOAD文やSELECT文の前に追加するコマンドです。

LOAD文の前に「Buffer」と追加すると、読み込んだデータを自動的にローカルのQVDファイルに出力し、以降はそのQVDファイルからデータを読み込みます。
さらに不要になったQVDファイルは自動的に削除されるため、管理の手間もありません。

少し乱暴ですが、簡単にまとめると以下のようになります。
Bufferプレフィックスは、QVDファイルが
・なければ作る
・あれば使う
・いらなくなれば削除する
という機能です。


STORE文との違い

前回の記事でご紹介したSTORE文は、ファイル名やパスを指定して明示的にQVDファイルを作成します。そのため本番環境で使用する永続的なQVDファイルを作成したい場合に、言い換えるとQVDファイルを手動で管理したい場合に使用します。

これに対してBufferプレフィックスは、裏で暗黙的にQVDファイルが生成され、使用され、削除されます。そのため開発環境で一時的に使用するQVDファイルを作成したい場合に使用します。

 STORE文Buffreプレフィックス
作成明示的暗黙的
管理手動自動
永続性永続的一時的
利用目的本番環境での高速リロードや差分更新開発時のリロード効率の向上


補足:その他のプレフィックス

QlikViewとQlik Senseには、Bufferプレフィックス以外にもさまざまなプレフィックスがあります。たとえば、Firstプレフィックス(先頭何行かをロードする)、Joinプレフィックス(テーブルを結合する)などです。


Bufferプレフィックスの使用

Bufferプレフィックスを使用する場合、LOAD文の前に「Buffer」と追加します。
Buffer
LOAD ...

それでは実際に試してみましょう。
ドキュメントを新規に作成し、[ロードスクリプトの編集]画面を起動します。
create-qvd-file-by-using-buffer-prefix-101
以下のロードスクリプトを貼り付けてください。
sample:
Buffer
LOAD RecNo() as RecNo,
     Ceil(Rand() * 10) as Number1,
     Ceil(Rand() * 100) as Number2,
     Ceil(Rand() * 1000) as Number3,
     Left(Hash128(Rand()), 3) as Text1,
     Left(Hash128(Rand()), 5) as Text2,
     Left(Hash128(Rand()), 10) as Text3
AutoGenerate 5000000;

DROP Table sample;
詳細は割愛しますが「AutoGenerate 5000000」の指定により5百万件のデータを自動生成しています。LOAD文の内容はとくに重要ではありません。Rand関数などを使って乱数の値を自動生成しています。
最後にDROP文で、読み込んだデータをドキュメントから削除しています。今回はBufferプレフィックスの動作が確認できればよいため、データを読み込んだ後、データをすべて削除しています。
create-qvd-file-by-using-buffer-prefix-102
リロードを実行します。
create-qvd-file-by-using-buffer-prefix-103
ファイルを保存してください。
ここでは「qvdfile」というフォルダに「buffer_test.qvw」というファイル名で保存しています。
create-qvd-file-by-using-buffer-prefix-104
リロードが完了しました。
「経過時間」を見ると、35秒掛かっていることが分かります。
create-qvd-file-by-using-buffer-prefix-105
では、そのままもう一度リロードを実行してください。
create-qvd-file-by-using-buffer-prefix-106
「buffered」の表示は、自動生成されたQVDファイルからデータが読み込まれたことをあらわしています。
「経過時間」を見ると、13秒でリロードが完了しています。先ほどよりもリロード時間が短縮されていますね。
create-qvd-file-by-using-buffer-prefix-107今回は「AutoGenerate」でデータを自動生成していますが、データベースからデータを読み込む場合や、大量データの場合はさらに顕著な差があらわれます。

Bufferプレフィックスの基本的な使い方はこれだけです。LOAD文の前に「Buffer」と追加するだけで、あとはQlikViewが必要に応じてQVDファイルを作成し、リロードを効率化してくれます。

それでは、自動生成されたQVDファイルを確認してみましょう。
まず、ファイルの保存場所はユーザープロパティから確認、変更できます。
[設定]メニュー→[ユーザープロパティ]を選択し、[パス]タブで[QVDバッファ]の値を確認します。
create-qvd-file-by-using-buffer-prefix-108
以下が保存先の初期設定です。
C:\Users\<ユーザー名>\AppData\Local\QlikTech\QlikView\Buffers
Qlik Sense Desktopの場合は以下が保存先です。
C:\Users\<ユーザー名>\Documents\Qlik\Sense\Buffers
該当のディレクトリを見てみましょう。
規則性のない長いファイル名のQVDファイルが、自動生成されていることが分かります。
create-qvd-file-by-using-buffer-prefix-109

以上でBufferプレフィックスの確認は終了です。
以降LOAD文を変更するまで、キャッシュされたQVDファイルからデータが読み込まれます。
LOAD文を変更すると、QVDファイルは削除され新しいQVDファイルが作成されます。逆に言うと、LOAD文を変更するまで(またはQVDファイルを手動で削除するまで)、データの内容は更新されませんので注意してください。


Bufferプレフィックスの内部動作

前述のとおり、BufferプレフィックスではQVDファイルの管理について意識する必要はない(と言うか自由に管理できない)のですが、Bufferプレフィックスの内部動作についてリファレンスマニュアルの記載を確認してみましょう。

参照したマニュアル
参照しているリファレンスマニュアル、およびバージョンは以下のとおりです。
QlikViewリファレンスマニュアル バージョン11.20 SR12 日本語版

QVDファイルのファイル名

QVDファイルには規則性のない長いファイル名が自動で割り当てられていましたが、これには以下のようなルールがあります。
以下はQlikViewリファレンスマニュアル P278『Buffer』からの引用です。

QVDファイルの名前は、計算で求められた名前(160ビットの16進ハッシュ。後続のloadまたはselectステートメントとその他の識別情報の全体)であり、通常ApplicationDataフォルダか、ユーザープロパティ:パス(105ページ)ページで指定された別のフォルダに保存されます。つまり、QVDバッファは、後続のloadまたはselectステートメントの変更によって無効になることを意味します。

create-qvd-file-by-using-buffer-prefix-diagram-1あの規則性のない長い名前は、LOAD文の内容からハッシュ値を計算することで求められているということです。
つまり、LOAD文の内容がまったく同じであれば、QVDファイルの名前も同じになり、キャッシュされたQVDファイルからデータが読み込まれます。
逆に、LOAD文の内容を少しでも変更した場合は、QVDファイルは削除され、別の名前のQVDファイルが新しく作成されます。

QVDファイルの削除

では、こんどはQVDファイルの削除について見てみましょう。
以下はQlikViewリファレンスマニュアル P279『Buffer』からの引用です。

通常、QVDバッファが削除されるのは、そのバッファを作成したドキュメントのスクリプト全体の実行でバッファが参照されなくなったときと、そのバッファを作成したドキュメントが存在しなくなったときです。

前述のとおり、LOAD文を変更した場合はQVDファイルは再作成されます。またドキュメント(QVWファイル)が削除された場合もQVDファイルは削除されます。
ドキュメントが削除されたことを、QlikViewがどのように検知しているかはリファレンスマニュアルからは読み取れませんが、確かに関連するドキュメントをすべて削除した上で、リロードを実行するとQVDファイルが削除されました。

「ドキュメントプロパティ」と「ユーザープロパティ」の設定を変更することで、QVDファイルの自動削除を無効にできます。しかしリファレンスマニュアルにあるとおり、QVDファイルの自動削除を無効化するのは推奨されません。
以下、同様にQlikViewリファレンスマニュアル P279『Buffer』からの引用です。

ドキュメントプロパティ:基本設定(508ページ)ページの照会先のないQVDバッファを保持するオプション(第1条件)とユーザープロパティ(85ページ)ダイアログの照会先のないQVDバッファを削除しないオプション(第2条件)をそれぞれオンにして、削除機能をオフにすることができますが、一般的には推奨しません。



ここまででBufferプレフィックスの使い方や内部動作について見てきました。
最後に、Bufferプレフィックスの2つのオプションを紹介します。

Bufferプレフィックスのオプション


Inclementalオプション

Buffer (Inclemental)
Inclementalオプションは、増分ロードをおこなう指定です。
過去のデータはQVDファイルから読み込み、新しいデータはもとのデータソースから追加で読み込みます。
一見便利な機能ですが、以下の制限があるので注意してください。
  1. テキストファイルでのみ使用できます。
  2. 単純な増分ロードでのみ使用できます。
    過去のデータが変更されたり、削除されたりしている場合は正常にデータが読み込めません。
そのため、ログファイルのような過去のデータが変更されない、テキストファイルの増分ロードには使用できますが、データベースの差分更新などには使用できません。

Stale Afterオプション

Buffer (Stale [After] <n> [hours | days])
Stale Afterオプションは、QVDファイルの有効期限を設定する指定です。

Buffer (Stale After 3 hours) 有効期限を3時間に設定します。
Buffer (Stale After 1 days) 有効期限を1日に設定します。
「After」の記述を省略し、以下のように指定することもできます。
Buffer (Stale 1 days)
有効期限を過ぎた場合、QVDファイルは再作成されます。

以下のようにカンマ区切りで、InclementalオプションとStale Afterオプションを併用することもできます。
Buffer (Inclemental, Stale After <n> [hours | days])
しかし、一定期間でファイルを削除し(Stale Afterオプション)、かつ増分ロードをする(Inclementalオプション)というのは、かなり用途が限定されると思います。


最後に…

今回はBufferプレフィックスをご紹介しました。
BufferプレフィックスはQVDファイルの管理を手動で制御できないため、本番運用で使用するというよりも、やはり開発効率を向上するために使用する機能になります。

最後になりましたが、Bufferプレフィックスの消し忘れには充分ご注意ください。
Bufferプレフィックスを残したまま、ドキュメント(QVWファイル)を本番のサーバーに展開した場合、何度リロードを実行しても最新のデータが取り込まれず、混乱のもとになります。