使用 QVD 文件进行增量加载
增量加载是有关数据库的非常普通的任务。它被定义为只加载数据库中新建或更改的记录。所有其他数据都以某种方式应已可用。 QVD 文件在大多数情况下都可执行增量加载。
这种基本过程描述如下:
1. 从数据库表格中加载新建数据(一个缓慢的过程,但只加载有限的记录)。
2. 从 QVD 文件加载旧数据(加载许多记录,但是快得多)。
3. 创建新的 QVD 文件。
4. 为每一个加载的表格重复该过程。
实际解决方法的复杂性根据源数据库的特性而定,但可识别以下基本情况:
1) 情形 1:只附加 (通常是日志文件
以下您可发现这些每一种情况的简要解决方法。读取 QVD 文件既可使用优化模式也可使用标准模式。(采用的方法根据操作的复杂性自动由 QlikView 脚本引擎选择。)优化模式大约比标准模式快 10 倍(非常接近),或比以普通方式加载数据库快 100 倍。
情形 1:只附加
最简单的案便例是日志文件,其为只附加而不删除记录的文件。适用以下条件:
-
数据库必须是包含在文本文件(非 ODBC/OLE DB)中的日志文件 (或以附加而非插入或删除方式加载记录的其他文件)。
-
QlikView 对以前已读入的记录号保持跟踪,并只加载在文件末尾新添加的记录。
示例:
缓冲区(增量)加载* 从 LogFile.txt(ansi、txt,分隔符为“\t”,嵌入式标签);
情形 2:仅插入(无更新或删除)
如果数据贮留在数据库中而不是一个简单的日记文件中,情形 1 的方法将行不通。然而只需多做一点少量工作问题就可解决。适用以下条件:
-
数据源可以是任何数据库。
-
QlikView 加载在最后一个脚本的执行后插入数据库的记录。
-
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 加载在最后一个脚本的执行后插入数据库或在数据库中更新的记录。
-
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 删除在最后一个脚本的执行后从数据库删除的记录。
-
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