加载新的和更新的记录与增量加载
如果应用程序包含不断更新的数据库源中的大量数据,则加载整个数据集可能会非常耗时。在这种情况下,需要从数据库中加载新记录或更改的记录。所有其他数据应该已经在应用程序中提供。增量加载使用 QVD 文件可以实现此操作。
这种基本过程描述如下:
-
从数据库源表中加载新的或更新的数据。
这是一个缓慢的过程,但只会加载数量有限的记录。
-
加载数据已经在 QVD 文件的应用程序中提供。
不但可以加载多条记录,而且这也是一个速度非常快的过程。
-
创建新的 QVD 文件。
该文件是您在下一次执行增量加载时要使用的文件。
- 为每一个加载的表格重复该过程。
以下示例显示了使用增量加载的情况。但是,可能需要更复杂的解决方案,取决于源数据库结构和操作模式。
- 只附加(通常用于日志文件)
- 只插入(无更新或不删除)
- 插入及更新(不删除)
- 插入、更新和删除
您可以在优化模式或标准模式中读取 QVD 文件。(采用的方法根据操作的复杂性自动由 Qlik Sense 脚本引擎选择。)优化模式是标准模式速度的大约 10 倍,或比以普通方式加载数据库快 100 倍。
有关更多信息,请参阅使用 QVD 文件。
只附加
最简单的案便例是日志文件,其为只附加而不删除记录的文件。适用以下条件:
-
数据库必须是包含在文本文件(ODBC、OLE DB 或不支持的其他数据库)中的日志文件(或以附加而非插入或删除方式加载记录的其他文件)。
-
Qlik Sense 对以前已读入的记录号保持跟踪,并只加载在文件末尾新添加的记录。
示例:
Buffer (Incremental) Load * From LogFile.txt (ansi, txt, delimiter is '\t', embedded labels);
只插入(无更新或不删除)
如果数据贮留在数据库中而不是一个简单的日记文件中,附加方法将行不通。然而,只需多做一点少量工作问题就可解决。适用以下条件:
-
数据源可以是任何数据库。
-
Qlik Sense 加载在最后一个脚本的执行后插入数据库的记录。
-
Qlik Sense 可识别需要 ModificationTime 字段(或类似字段)的新记录。
示例:
QV_Table:
SQL SELECT PrimaryKey, X, Y FROM DB_TABLE
WHERE ModificationTime >= #$(LastExecTime)#
AND ModificationTime < #$(BeginningThisExecTime)#;
Concatenate LOAD PrimaryKey, X, Y FROM File.QVD;
STORE QV_Table INTO File.QVD;
SQL WHERE 子句中的 # 号定义数据的开始或结束。请参阅数据库手册,了解数据库的正确日期语法。
插入及更新(不删除)
当以前加载的记录中的数据可能在脚本执行期间更改时就适用下一个情形了。适用以下条件:
数据源可以是任何数据库。
Qlik Sense 加载在最后一个脚本的执行后插入数据库或在数据库中更新的记录。
Qlik Sense 可识别需要 ModificationTime 字段(或类似字段)的新记录。
Qlik Sense 从 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;
插入、更新和删除
最难处理的情形是记录实际从脚本执行之间的数据库源中被删除的时候。适用以下条件:
数据源可以是任何数据库。
Qlik Sense 加载在最后一个脚本的执行后插入数据库或在数据库中更新的记录。
Qlik Sense 删除在最后一个脚本的执行后从数据库删除的记录。
Qlik Sense 可识别需要 ModificationTime 字段(或类似字段)的新记录。
Qlik Sense 从 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