使用 QVD 檔案進行累加載入
累加載入在資料庫中是非常常見的相關工作。其定義就是載入資料庫中的新記錄或變更的記錄,除此之外不會再載入其他項目。所有其他的資料早已可透過某種方式來使用。使用 QVD 檔案能夠在大部分案例中執行累加載入。
基本程序如下所述:
1. 從資料庫表格載入新資料 (程序緩慢,載入的記錄筆數有限)。
2. 從 QVD 檔案載入舊資料 (載入許多資料,程序速度較快)。
3. 建立新 QVD 檔案。
4. 針對每個載入的表格重複該程序。
實際解決方案的複雜性會根據來源資料庫的本質而定,但是可確定會有下列的基本案例:
1) 案例 1:僅附加 (一般記錄檔)
您可在下面找到上述每個案例的大致解決方案。可在最佳化模式或標準模式下讀取 QVD 檔案。(QlikView 指令碼引擎會根據操作的複雜性,自動選取採用的方式。) 最佳化模式 (非常近似) 大約比標準模式快了 10x,或大約比用一般方式載入資料庫快了 100x。
案例 1:僅附加
最簡單的案例是其中一個記錄檔,在該記錄中的檔案只會附加,永遠不會刪除。適用下列條件:
-
資料庫必須是包含在文字檔 (非 ODBC/OLE DB) 中的記錄檔 (或是某些其他檔案,其中的記錄是附加進去的,不會插入或刪除)。
-
QlikView 會追蹤之前已經讀取過的記錄筆數,並只載入在檔案結尾新增的記錄。
範例:
Buffer (Incremental) Load * From LogFile.txt (ansi, txt, delimiter is '\t', embedded labels);
案例 2:僅插入 (不更新或刪除)
如果資料所在的資料庫不是簡單的記錄檔,案例 1 的方法可能無效。不過,只要再進行多一點工作還是可解決問題。適用下列條件:
-
資料來源可以是任何資料庫。
-
QlikView 會在最後一次執行指令碼後載入插入資料庫的記錄。
-
QlikView 需要 ModificationDate (修改日期) 或類似欄位才能辨識哪些記錄是新記錄。
範例:
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 需要 ModificationDate (修改日期) 或類似欄位才能辨識哪些記錄是新記錄。
-
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 需要 ModificationDate (修改日期) 或類似欄位才能辨識哪些記錄是新記錄。
-
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