# 使用累加載入載入新的和更新的記錄

如果您的應用程式包含大量來自持續更新的資料庫來源的資料，重新載入整個資料集會相當耗時。在此情況下，您想要從資料庫載入新的或變更的記錄。所有其他資料應該已在應用程式中可供使用。使用 QVD 檔案的累加載入可實現此功能。

基本程序如下所述：

1. 從資料庫來源表格載入新的或更新的資料。

   此流程緩慢，但只會載入有限數量的記錄。

2. 從 QVD 檔案載入已在應用程式中可供使用的資料。

   會載入許多記錄，但此流程速度較快。

3. 建立新的 QVD 檔案。

   這是下次進行累加載入時您將使用的檔案。

4. 針對每個載入的表格重複該程序。

下列範例顯示使用了累加載入的情況。不過，視來源資料庫結構以及操作模式而定，可能需要更複雜的解決方案。

* 僅插入 (不更新或刪除)
* 插入和更新 (不刪除)
* 插入、更新和刪除

您可在最佳化模式或標準模式下讀取 QVD 檔案。(採用的方式由 Qlik Sense 引擎根據操作的複雜度自動選取。) 最佳化模式大約比標準模式快 10 倍，或大約比以一般方式載入資料庫快 100 倍。

如需詳細資訊，請參閱[使用 QVD 檔案](https://help.qlik.com/zh-TW/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)