# QVD ファイルを使用した増分ロード

増分ロードは、データベースではきわめて一般的なタスクです。増分ロードとは、データベースから新しいレコードまたは変更されたレコードだけをロードすることを指します。残りのデータは、既に何らかの方法でアクセス可能になっています。[QVD ファイル](https://help.qlik.com/ja-JP/qlikview/September2026/Subsystems/Client/Content/QV_QlikView/QVD_files.htm) で、ほとんどの場合増分ロードを実行できます。

基本手順を以下に説明します。

1. データベース テーブルから 新しいデータ をロードします (時間がかかりますが、限定されたレコード数をロードします)。

2. QVD ファイルから 古いデータ をロードします (ロードするレコード数は多いですが、はるかに高速な処理です)。

3. 新しい QVD ファイルを作成します。

4. ロードされるテーブルごとに手順を繰り返します。

このソリューションの実際の複雑さはソース データベースの条件によって異なりますが、以下に示す基本的なケースを確認できます。

1) [ケース 1: 追加のみ](https://help.qlik.com/ja-JP/qlikview/September2026/Subsystems/Client/Content/QV_QlikView/QVD_Incremental.htm#Append_only) (通常はログ ファイル)

2) [ケース 2: 挿入のみ (更新または削除なし)](https://help.qlik.com/ja-JP/qlikview/September2026/Subsystems/Client/Content/QV_QlikView/QVD_Incremental.htm#Insert_only)

3) [ケース 3: 挿入および更新 (削除なし)](https://help.qlik.com/ja-JP/qlikview/September2026/Subsystems/Client/Content/QV_QlikView/QVD_Incremental.htm#Insert_and_Update)

4) [ケース 4: 挿入、更新、および削除](https://help.qlik.com/ja-JP/qlikview/September2026/Subsystems/Client/Content/QV_QlikView/QVD_Incremental.htm#Insert__Update_and_Delete)

次に、それぞれのケースごとのソリューションについて簡単に説明します。QVD ファイルは、最適化と標準のどちらかのモードで読み取ることができます。(使用されるモードは、オペレーションの複雑さによって QlikView スクリプト エンジンが自動的に選択します。) 最適化モードは、(かなり大まかに) 標準モードの約 10 倍、データベースのロードよりも普通の方法で約 100 倍速くなっています。

## ケース 1: 追加のみ

最も単純なケースはログ ファイルです。このようなファイルではレコードが追加されるだけで、削除されることはありません。次の条件が適用されます。

* データベースは、テキスト ファイル (ODBC/OLE DB 以外) に含まれているログ ファイル (またはレコードが挿入または削除ではなく追加される他のファイル) でなくてはなりません。

* QlikView は、以前に読み取られたレコード数を常に記録し、ファイルの末尾に追加されたレコードだけをロードします。

`Buffer (Incremental) Load * From LogFile.txt (ansi, txt, delimiter is '\t', embedded labels);`

## ケース 2: 挿入のみ (更新または削除なし)

単純なログ ファイル以外のデータベースにデータが存在する場合は、ケース 1 の方法は機能しません。ただし、少しの作業を追加するだけで問題を解決できます。次の条件が適用されます。

* データ ソースには、任意のデータベースを使用できます。

* QlikView は、最後のスクリプト実行後にデータベースに挿入されたレコードをロードします。

* 項目 ModificationDate (または同様の項目) は、どのレコードが新しいかを QlikView が認識するために必要です。

`QV_Table:` `SQL SELECT PrimaryKey, X, Y FROM DB_TABLE` `WHERE ModificationTime >= #$(LastExecTime)#` `AND ModificationTime < #$(BeginningThisExecTime)#;` ` ` `Concatenate LOAD PrimaryKey, X, Y FROM File.QVD (qvd);` `STORE QV_Table INTO File.QVD;`

(SQL WHERE 句のハッシュ記号は日付の開始と終了を定義します。ご使用中のデータベースの適正な日付構文については、データベース マニュアルを確認してください。)

## ケース 3: 挿入および更新 (削除なし)

次のケースは、以前にロードされたレコード内のデータがスクリプト実行時に変更されている場合に適用可能です。次の条件が適用されます。

* データ ソースには、任意のデータベースを使用できます。

* QlikView は、最後のスクリプト実行後にデータベースに挿入されたレコード、またはデータベースで更新されたレコードをロードします。

* 項目 ModificationDate (または同様の項目) は、どのレコードが新しいかを QlikView が認識するために必要です。

* QlikView が QVD ファイルから更新されたレコードをソートするためには、プライマリ キー項目が必要です。

* このソリューションでは、QVD ファイルの読み取りは (最適化モードではなく) 標準モードで行われます。標準モードはデータベース全体をロードするよりも、かなり高速です。

`QV_Table:` `SQL SELECT PrimaryKey, X, Y FROM DB_TABLE` `WHERE ModificationTime >= #$(LastExecTime)#;` ` ` `Concatenate LOAD PrimaryKey, X, Y FROM File.QVD` `WHERE NOT Exists(PrimaryKey);` ` ` `STORE QV_Table INTO File.QVD;`

## ケース 4: 挿入、更新、および削除

最も処理が難しいケースは、スクリプト実行時にソース データベースからレコードが実際に削除されている場合です。次の条件が適用されます。

* データ ソースには、任意のデータベースを使用できます。

* QlikView は、最後のスクリプト実行後にデータベースに挿入されたレコード、またはデータベースで更新されたレコードをロードします。

* QlikView は、最後のスクリプト実行後にデータベースから削除されたレコードを削除します。

* 項目 ModificationDate (または同様の項目) は、どのレコードが新しいかを QlikView が認識するために必要です。

* QlikView が QVD ファイルから更新されたレコードをソートするためには、プライマリ キー項目が必要です。

* このソリューションでは、QVD ファイルの読み取りは (最適化モードではなく) 標準モードで行われます。標準モードはデータベース全体をロードするよりも、かなり高速です。

` Let ThisExecTime = Now( );  ` ` ` `QV_Table:` `SQL SELECT PrimaryKey, X, Y FROM DB_TABLE` `WHERE ModificationTime >= #$(LastExecTime)#` `AND ModificationTime < #$(ThisExecTime)#;` ` ` `Concatenate LOAD PrimaryKey, X, Y FROM File.QVD` `WHERE NOT EXISTS(PrimaryKey);` ` ` `Inner Join SQL SELECT PrimaryKey FROM DB_TABLE;` ` ` ` If ScriptErrorCount = 0 then  ` `STORE QV_Table INTO File.QVD;` ` Let LastExecTime = ThisExecTime;  ` `end if`