使用累加載入載入新的和更新的記錄
如果您的應用程式包含大量來自持續更新的資料庫來源的資料,載入整個資料集會相當耗時。在此情況下,您想要從資料庫載入新的或變更的記錄。所有其他資料應早已在應用程式中可用。使用 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