# 加载新的和更新的记录与增量加载

如果您的应用程序包含不断更新的数据库源中的大量数据，则重新加载整个数据集可能会非常耗时。在这种情况下，需要从数据库中加载新记录或更改的记录。所有其他数据应该已在应用程序中可用。增量加载使用 QVD 文件，可以实现此操作。

这种基本过程描述如下：

1. 从数据库源表中加载新的或更新的数据。

   这是一个缓慢的过程，但只会加载数量有限的记录。

2. 从 QVD 文件加载应用程序中已有的数据。

   不但可以加载多条记录，而且这也是一个速度非常快的过程。

3. 创建新的 QVD 文件。

   该文件是您在下一次执行增量加载时要使用的文件。

4. 为每一个加载的表格重复该过程。

以下示例显示了使用增量加载的情况。但是，可能需要更复杂的解决方案，取决于源数据库结构和操作模式。

* 只插入（无更新或不删除）
* 插入及更新（不删除）
* 插入、更新和删除

您可以在优化模式或标准模式中读取 QVD 文件。（采用的方法根据操作的复杂性自动由 Qlik Sense 脚本引擎选择。）优化模式是标准模式速度的大约 10 倍，或比以普通方式加载数据库快 100 倍。

有关更多信息，请参阅[使用 QVD 文件](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/Scripting/work-with-QVD-files.htm)。



## 只插入（无更新或不删除）

如果数据贮留在数据库中而不是一个简单的日记文件中，附加方法将行不通。然而，只需多做一点少量工作问题就可解决。适用以下条件：

* 数据源可以是任何数据库。

* 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 [lib://DataFiles/File.QVD];
		``STORE QV_Table INTO [lib://DataFiles/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 [lib://DataFiles/File.QVD]``WHERE NOT Exists(PrimaryKey);`` ``STORE QV_Table INTO [lib://DataFiles/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 [lib://DataFiles/File.QVD]``WHERE NOT EXISTS(PrimaryKey);`` ``Inner Join SQL SELECT 
		PrimaryKey FROM DB_TABLE;`` `` If ScriptErrorCount = 
		0 then  ``STORE QV_Table INTO [lib://DataFiles/File.QVD];``Let LastExecTime = ThisExecTime; 
		``End If`

相关学习内容：

* [如何使用增量负载处理当前记录？](https://help.qlik.com/lnk/How_process_current_records_incremental_load)

## 了解详情

* [如何使用增量负载处理当前记录？](https://help.qlik.com/lnk/How_process_current_records_incremental_load)