大量データを超高速に読み込むQVDファイルの使い方

大量データを超高速に読み込むQVDファイルの使い方

Pocket

QlikViewとQlik Senseには、QVDファイルと呼ばれる独自の形式のファイルがあり、これを使用するとデータの読み込みが非常に高速になります。(リファレンスマニュアルによると、10倍から100倍高速になるとのことです。)
とくに大量データの読み込みや差分更新などで威力を発揮するのですが、読み込みが非常に高速で使い勝手がよいため、QlikViewやQlik Senseでは日常的に使用する機能になります。

この記事では、QVDファイルの概要から、QVDファイルの使い方、注意事項まで説明していきます。
QVDファイルを使用することで、開発生産性が大幅に向上しますので、ぜひご一読ください。

参照したマニュアル
この記事では正確を期すために、リファレンスマニュアルの記載を多数引用しています。参照しているリファレンスマニュアル、およびバージョンは以下のとおりです。
QlikViewリファレンスマニュアル バージョン11.20 SR12 日本語版

QVDファイルとは

QVDファイルとは何なのか理解するために、リファレンスマニュアルの記載を見てみましょう。
以下はQlikViewリファレンスマニュアル P493『28 QVDファイル』からの引用です。

QVD(QlikView Data)ファイルは、QlikViewからエクスポートされたデータのテーブルを含むファイルです。QVDは、ネイティブQlikViewファイルで、QlikViewでのみ読み書きすることができます。ファイル形式は、QlikViewスクリプトからデータを高速に読み取れるように最適化され、サイズもコンパクトです。QVDファイルからのデータの読み取りは、ほかのデータソースから読み取る場合よりも一般に10~100倍高速になります。

つまり、QVDファイルとはQlikView独自のデータファイルで、QlikView用に最適化されているため、ほかと比べてデータの読み込みが10~100倍高速になるということです。
“QlikView用に最適化される”の詳細については、以前書いたこちらの記事をご参照ください。QlikViewが内部的にどのようにデータを最適化しているかをまとめています。

補足
QVDファイルはQlik Senseでも使用できます。
上記はQlikViewリファレンスマニュアルを引用しているため、”QlikView”となっていますが、QVDファイルはQlik Senseでも使用できます。

QVDファイルの使用目的

では、どのようなときにQVDファイルを使うのでしょうか。リファレンスマニュアルでは以下の4つの用途を挙げています。
以下はQlikViewリファレンスマニュアル P493『28.1 QVD ファイルの使用目的』からの引用です。

  1. ロード速度の向上
  2. データベースサーバーの負荷の減少
  3. 複数のQlikViewアプリケーションからのデータの統合
  4. 増分/差分ロード

順番に見ていきましょう。

ロード速度の向上

これは単純な話で、QVDファイルからの読み込みは非常に高速であるため、ロードの速度が向上するということです。

データベースサーバーの負荷の減少、複数のQlikViewアプリケーションからのデータの統合

この2つは関係が深いので、一緒に解説します。
複数のアプリケーションでおなじデータを使用する場合に、毎回データベースに問い合わせに行くのは非効率です。
データベースに一度問い合わせに行ったら結果をQVDファイルに出力しておき、以降はQVDファイルからデータを読み込めば、速度の向上に加えてデータベースサーバーの負荷軽減にもつながります。

さらにこれは、複数のアプリケーションで使用するデータを一元管理できるということにもなります。
簡単に図示すると以下のようになります。
qvd-file-uses

増分/差分ロード

データ量が多くデータのロードに時間が掛かる場合、増分/差分ロードを検討します。
実際の指定方法は要件によって変わるため一概には言えないのですが、簡単に言うと過去のデータ(変更されないデータ)をQVDファイルに出力しておくことで、データのロードを効率的におこなえるということです。
たとえば日次でデータを更新する場合、前日までのデータはあらかじめ作成済みのQVDファイルから読み込み、当日のデータのみデータベースから直接読み込みます。そしてこれらを連結(Concatenate)して最新版のデータとし、さらに翌日の日次処理のためにQVDファイルにも出力しておきます。
翌日以降またおなじことを繰り返すことで、全体としてデータのロードを高速化できます。

補足

リファレンスマニュアルと重複するかもしれませんが、”開発効率の向上”という利点も追加で挙げておきたいと思います。
実際の開発では、ロードスクリプトを一回ですべて完成させることは稀で、多くの場合すこし修正してはリロードを実行するという作業を繰り返しながら、完成に向かっていきます。そのたびにデータベースから直接データを読み込もうとすると、”リロードの完了待ち”が多発して非常に非効率です。またオフラインで開発をしたい、さらにはデータ量を絞った開発用のデータが欲しいといった要望もあるかと思います。
このような場合に、開発用のデータをQVDファイルとして保持しておくと、開発が非常に進めやすくなります。


QVDファイルの作成方法

では、どのようにQVDファイルを作成するのか説明します。リファレンスマニュアルでは、QVDファイルを作成する方法は3つあるとしています。
  1. STORE文による明示的な作成
  2. Bufferプレフィックスによる自動作成
  3. シートオブジェクトの内容をエクスポートする
まず、1つ目の「STORE文による明示的な作成」が一番よく使われる方法で、”QVDファイルを作成する”と言った場合、通常STORE文による作成のことを指します。
2つ目の「Bufferプレフィックスによる自動作成」は、なかなか奥が深い機能であるため後日別の記事にまとめたいと思います。
また、3つ目の「シートオブジェクトの内容をエクスポートする」は、単純にストレートテーブルなどを右クリック→[エクスポート]のメニューからQVD形式でエクスポートできるというものです。
what-is-qvd-file-201what-is-qvd-file-202

STORE文の指定方法

それではSTORE文の指定方法を見てみましょう。STORE文は以下のように指定します。
STORE <テーブル名> into <ファイル名>(qvd | txt)
STORE文ではQVD形式だけでなく、CSV形式でもデータを出力できます。
形式を指定したい場合は、ファイル名の後ろにフォーマットを指定します。なおフォーマットの指定を省略するとQVD形式で出力されます。
以下は例文です。
STORE Table1 into file1.qvd QVD形式で出力します。(フォーマットを省略するとQVD形式で出力されます。)
STORE Table1 into file2.qvd(qvd) QVD形式で出力します。
STORE Table1 into file3.csv(txt) CSV形式で出力します。
ご注意
Qlik Senseではファイル名の指定方法が若干異なります。
詳細は後述のQlik SenseでのQVDファイルの作成方法をご覧ください。


標準(高速)モードと最適化(超高速)モード

QVDファイルからのデータのロードも、ほかのファイルとおなじように指定できます。
ただし、LOAD文の指定によって標準(高速)モードで読み込まれるか、最適化(超高速)モードで読み込まれるかが変わります。標準モードでも十分高速なのですが、最適化モードはさらに高速ですので、できるだけ最適化モードで読み込まれるようにしましょう。
最適化モードで読み込むには、QVDファイルの内容を変換なしでそのまま読み込みます。
たとえば、数式によってあたらしい項目を追加したりすると、標準モードでの読み込みとなります。項目名の変更や項目の削除(QVDファイル中の一部の項目のみを読み込む)だけであれば、最適化モードで読み込まれます。


演習

それでは、実際にQVDファイルの作成と読み込みを試してみましょう。
ここはぜひ実際に操作してみてください。

初期設定

ドキュメントを作成する前に、ユーザープロパティを1つ設定しておきます。
この演習ではリロードに掛かった時間を確認したいため、[ロードスクリプトの進捗]画面を自動で閉じないように設定しておきます。
QlikViewを起動して、[設定]メニュー→[ユーザープロパティ]を選択し、ユーザープロパティを開きます。
[基本設定]タブで、[リロード終了後、ダイアログを自動的に閉じない]にチェックを入れてください。
what-is-qvd-file-101

サンプルデータの作成

ドキュメントを新規に作成し、[ロードスクリプトの編集]画面を起動します。
what-is-qvd-file-102
QVDファイルを作成する前に、まずはもとになるサンプルデータを自動生成します。
以下のロードスクリプトを貼り付けてください。
sample:
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 100;
「AutoGenerate 100」の指定により100件のデータが自動生成されます。項目はRand関数により乱数の値を自動生成しています。1桁から3桁の数値と、3文字、5文字、10文字の文字列のデータを作成しています。
what-is-qvd-file-103[OK]ボタンをクリックします。
リロードを実行します。
what-is-qvd-file-104
ファイルを保存してください。
ここでは「qvdfile」というフォルダに「create_qvd.qvw」というファイル名で保存しています。
what-is-qvd-file-104-1what-is-qvd-file-105
リロードが完了しました。
[閉じる]ボタンをクリックしてください。
what-is-qvd-file-106
どのようなデータが作成されたのか確認してみましょう。
シートの余白で右クリックし[シートオブジェクトの追加]→[テーブルボックス]を選択します。
what-is-qvd-file-107
すべての項目を選択し、[ロード順]ボタンをクリックして、データをロードした順に並べ替えます。
[OK]ボタンをクリックします。
what-is-qvd-file-108
データが確認できました。乱数の数値や文字列のデータが100件作成されています。
what-is-qvd-file-109

QVDファイルの作成

では、QVDファイルを作成してみましょう。
[ロードスクリプトの編集]画面を再度開きます。
ロードスクリプトの後半部分を以下のように編集します。
AutoGenerate 5000000;

STORE sample into sample.qvd;
STORE sample into sample.csv(txt);

DROP Table sample;
what-is-qvd-file-110ここでは、以下の3つの指定を追加、変更しています。
  • まず100件だと件数が少ないため、「AutoGenerate」の後ろを「5000000」まで増やしています。ここはお使いの環境に応じて適宜調節してください。
    こちらではメモリ4GBを割り当てた仮想マシンを使用しています。スペックに応じて100万件~1000万件程度にするといいでしょう。
  • つづいてSTORE文でQVDファイルとCSVファイルを出力しています。
  • 最後にDROP文でテーブルを削除しています。このドキュメントはQVDファイルとCSVファイルの生成のみに使うもので、このドキュメント自体はデータを持つ必要がありません。そのため、ファイルを出力したあとテーブルを削除しています。
再度リロードを実行してください。
500万件のデータが生成されました。
what-is-qvd-file-111以上で1つ目のドキュメント(QVDを作成するためのQVW)は完成です。ドキュメントを閉じてください。

QVDファイルの読み込み

それでは、いま作成したQVDファイルからデータをロードしてみましょう。
ドキュメントを新規に作成し、[ロードスクリプトの編集]画面を起動します。
ロードスクリプトの最下行にカーソルをあわせて、[テーブルファイル]ボタンをクリックします。
what-is-qvd-file-112
比較のためにまず、CSVファイルからデータをロードします。
ドキュメントとおなじディレクトリに「sample.csv」というファイルが出力されているはずですので、こちらを選択してください。
what-is-qvd-file-113
今回は単純にデータをロードするだけですので、[終了]ボタンをクリックします。
what-is-qvd-file-114
ロードスクリプトが作成されたら、ここでも最下行にDROP文を追加してください。
DROP Table sample;
500万件のデータを読み込むため、データを残しておくとファイルの保存自体に時間が掛かってしまいます。今回はデータをロードする部分のテストだけできればよいため、DROP文によりテーブルを削除します。
[OK]ボタンをクリックします。
what-is-qvd-file-115
リロードを実行します。
what-is-qvd-file-116
ファイルを保存してください。
ここでは、前回とおなじディレクトリに「load_qvd.qvw」というファイル名で保存しています。
what-is-qvd-file-117
リロードが完了しました。
CSVファイルからの読み込みは、33秒掛かっています。
what-is-qvd-file-118こんどはQVDファイルからデータをロードしてみましょう。
[ロードスクリプトの編集]画面を再度開きます。

CSVファイルのLOAD文を削除するか、下図のようにコメントアウトしてください。
DROP文の前にカーソルをあわせて[テーブルファイル]ボタンをクリックします。
what-is-qvd-file-119
「sample.qvd」を選択します。
what-is-qvd-file-120
今回もデータをそのままロードするだけですので、[終了]ボタンをクリックします。
what-is-qvd-file-121
ロードスクリプトが作成されたら[OK]ボタンをクリックします。
what-is-qvd-file-122
リロードを実行します。
what-is-qvd-file-123
リロードが完了しました。
QVDファイルからの読み込みは、13秒で終了しました。CSVファイルのときと比べてかなり速くなっています。
what-is-qvd-file-124また、「qvd optimized」の表示にも注目してください。これは最適化モードでデータがロードされたことをあらわしています。

以上で演習は終了です。
今回はローカルのCSVファイルとの比較だったため、ロード時間の差は2.5倍程度の開きでしたが、データベースからデータを読み込む場合や、データの量や内容によっては、さらに大きな差がつきます。

ここまででQVDファイルの基本的な説明は終了です。ここからはQlik Senseでの指定方法や、よくいただくご質問、その他の注意事項について見ていきましょう。


Qlik SenseでのQVDファイルの作成方法

Qlik SenseでもQlikViewとおなじようにQVDファイルを使用できますが、QlikViewとQlik Senseではファイルパスの指定方法が異なります。
ファイルを指定する際、QlikViewではファイルシステム上の絶対パスや相対パスで指定しますが、Qlik Senseでは「lib://」ではじまる独自の方式(フォルダデータ接続)で指定します。
これは、ファイルシステムの露呈を防ぐという、セキュリティ上の理由によるものです。

STORE文でQVDファイルを出力する場合、QlikViewでは任意のディレクトリにファイルを出力できるのに対して、Qlik Senseではあらかじめアクセスが許可されたディレクトリにのみ、ファイルを出力できます。
QlikView
STORE Table1 into C:\file1.qvd;
C:ドライブ直下にファイルを出力します。
ここではfile1.qvdという名前で、QVDファイルを出力しています。

Qlik Sense
STORE Table1 into lib://dir1/file1.qvd;
あらかじめアクセスが許可されたdir1というディレクトリに、ファイルを出力しています。
dir1はQlik Senseのアプリ作成時に、あらかじめ設定したディレクトリです。

下図はQlik Senseのデータロードエディタです。
what-is-qvd-file-206フォルダデータ接続を新規に作成するには、画面右上の[接続の新規作成]ボタンから[フォルダ]を選択し、アクセスを許可したいディレクトリを選択します。


FAQ

ここではQVDファイルについて、よくいただくご質問をまとめます。

Q1.複数のテーブルをまとめて、1つのQVDファイルに出力できますか。

できません。1つのQVDファイルに出力できるのは1テーブルのみです。
あらかじめJoinで1つのテーブルに結合しておけば、それを1つのQVDファイルに出力することは可能です。

Q2.QVDファイルをロードスクリプトから削除できますか。

QlikViewの機能では、QVDファイルを削除することはできません。
EXECUTE文により、OSのコマンドを実行できるため、これを使用すればQVDファイルを削除できます。
たとえば、以下のように指定します。
EXECUTE CMD.EXE /C DEL "sample.qvd";
ただし、EXECUTE文はセキュリティ上、そのまま実行できないように制限が掛かっており、リロードを実行すると以下の警告が表示されます。
[セキュリティを上書きし、このステートメントを実行する]をクリックすると、EXECUTE文が実行されます。
what-is-qvd-file-207もしくは、以下の設定によりEXECUTE文をあらかじめ許可しておくこともできます。
[ロードスクリプトの編集]画面下部の[設定]タブ→[外部プログラムを実行する]にチェックを入れます。
what-is-qvd-file-203いずれもセキュリティ上の危険性を、ご理解いただいた上でお使いください。
なお、STORE文により同名のQVDファイルが作成された場合、古いファイルは自動で上書きされます。

Q3.QlikView Personal Editionでは、ほかのPCで作成したドキュメント(QVW)は使用できないとのことですが、ほかのPCで作成したQVDファイルは使用できますか。

QVDファイルであれば使用できます。あるPCで作成したQVDファイルを、ほかのPCにあるQlikView Personal Editionで読み込んで使用することができます。

Q4.QVDファイルよりも、それを読み込んだQVWファイルの方が、ファイルサイズが小さくなることがあります。これはなぜでしょうか。

まず、QVWにはQVDに含まれるデータに加え、ユーザーインターフェースなどの情報も含まれています。そのため情報量としては基本的に、QVD < QVWとなります。
しかし、QlikView Desktop(Personal Edition含む)はQVWを保存する際、自動でファイルを圧縮するため(ここで言う圧縮はZipのようなファイル圧縮のことです。)、QVWが圧縮された状態ではファイルサイズが逆転する場合があります。
QVWの圧縮率を「なし」に設定すると、QVWとQVDのファイルサイズはほぼおなじか、またはQVD < QVWとなります。

QVWの圧縮率の設定は、[設定]メニュー→[ドキュメントプロパティ]から「ドキュメントプロパティ」を開き、[基本設定]タブ→[圧縮率]で変更できます。
また、[設定]メニュー[ユーザープロパティ]から「ユーザープロパティ」を開き、[保存]タブ→[圧縮率]から設定を変更すると、ドキュメント新規作成時の初期値(ドキュメントプロパティの初期値)を変更できます。

「ドキュメントプロパティ」[基本設定]タブ
what-is-qvd-file-204
「ユーザープロパティ」[保存]タブ
what-is-qvd-file-205

その他の注意事項


Order By句について

QVDファイルからデータを読み込む際、Order By句によるデータの並べ替えはできません。LOAD文のOrder By句はResidentでテーブルを再読み込みする場合のみ使用できます。QVDファイルやExcel、CSVなどのファイルからデータを読み込む場合は使用できません。
データの並べ替えをしたい場合は、一度データをロードしたあとResidentで再読み込みします。
TempTable:
LOAD *
FROM file.qvd(qvd);

Table1:
NoConcatenate
LOAD *
Resident TempTable
Order By Field1, Field2;

DROP Table TempTable;

その他、リファレンスマニュアルからの抜粋

以下はQlikViewリファレンスマニュアル P504からの引用です。

QVDファイルからデータをロードする場合にupper関数を使用すると、ロードスピードが遅くなります。


以下はQlikViewリファレンスマニュアル P332からの引用です。

最適化されたQVDファイルをロードする際は、sampleプレフィックスを使用できません。

Sampleプレフィックスを使用すると、サンプルデータのためにランダムでデータを間引いてロードできます。
たとえば、LOAD文の前に「Sample 0.5」と追加すると、約50%のデータがランダムで抽出されます。
QVDファイルを最適化モードで読み込む場合、Sampleプレフィックスは無効になります。

以下はQlikViewリファレンスマニュアル P323からの引用です。

最適化モードでQVDファイルをロードする際、map … usingステートメントは機能しません。

こちらはマニュアルの記載が分かりにくいのですが、Mappingプレフィックスを使用すると最適化モードが無効になることを言っているものと思われます。こちらで検証したところ、Mappingプレフィックスを使用するとQVDファイルの最適化モードは無効になり、標準モードで読み込まれました。


参考文献

この記事を書くにあたり、参考にした資料をまとめておきます。
Document Compression | Qlikview Cookbook
http://qlikviewcookbook.com/2011/03/document-compression/
QVWファイルとQVDファイルにおける圧縮(compression)と重複削除(de-duplication)について、検証結果がまとめられています。
この記事によると、QVDファイルの中身は”RAM image”とのことで、つまりメモリにそのまま展開できるデータのイメージがQVDファイルであるとのことです。

QlikView Optimised QVD Loads – Quick Intelligence
http://www.quickintelligence.co.uk/qlikview-optimised-qvd-loads/
QVDファイルからのデータのロードが、最適化モードで実行される条件についてまとめられています。
これによると、おなじ項目を二回読み込む場合なども最適化が無効になるとのことです。