Inkrementelles Laden mit QVD-Dateien
Das inkrementelle Laden ist ein häufig anzutreffender Vorgang im Zusammenhang mit Datenbanken. Beim inkrementellen Laden werden nur neue oder geänderte Datensätze aus der Datenbank eingelesen. Unveränderte Datensätze dagegen sind in irgendeiner Form bereits vorhanden. Mit Hilfe von „QVD-Dateien“ kann man in den meisten Situationen einen inkrementellen Ladevorgang realisieren (siehe QVD-Dateien).
Der Prozess läuft folgendermaßen ab:
1. Neue Daten werden aus der Datenquelle gelesen (geringe Geschwindigkeit, aber auch nur wenige Datensätze).
2. Bestehende Daten werden aus einer QVD-Datei gelesen (viele Datensätze, aber sehr hohe Geschwindigkeit).
3. Es wird eine neue QVD-Datei angelegt.
4. Diese Schritte werden für alle Tabellen wiederholt.
Wie komplex dieser Prozess wird, hängt von der Struktur der Originaldatenquelle und von Umfang und Art der Änderungen ab. Im Wesentlichen lassen sich vier Fälle unterscheiden:
1) Fall 1: Nur angehängte Datensätze (normalerweise Protokolldateien
2) Fall 2: Nur eingefügte Datensätze (keine Aktualisierung oder Löschung)
3) Fall 3: Neu eingefügte und aktualisierte Datensätze (kein Löschen)
4) Fall 4: Neu eingefügte, aktualisierte und gelöschte Datensätze
Nachfolgend finden Sie für jeden dieser Fälle einen Lösungsansatz. QVD-Dateien können entweder im „Standardmodus“ oder im „optimierten Modus“ eingelesen werden. (Je nach Komplexität der Operation ergibt sich die ausgewählte Methode automatisch aus der QlikView Script Engine.) Der „optimierte Modus“ ist ungefähr 10x schneller als der „Standardmodus“ oder bis zu 100x schneller als der herkömmliche Ladevorgang der Datenbank.
Fall 1: Nur angehängte Datensätze
Das einfachste Beispiel für einen solchen Fall ist eine Protokolldatei, bei der neue Datensätze einfach hinten angehängt und niemals gelöscht werden. Folgende Bedingungen müssen erfüllt sein:
-
Die Datenbank muss eine Protokolldatei sein (oder eine andere Datei, in der Datensätze angehängt und nicht eingefügt oder gelöscht werden). Die Protokolldatei muss sich in einer Textdatei befinden (nicht ODBC/OLE DB).
-
QlikView speichert die Anzahl der bereits vorher geladenen Datensätze und liest nur die neuen Datensätze am Ende der Datei ein.
Beispiel:
Buffer (Incremental) Load * From LogFile.txt (ansi, txt, delimiter is '\t', embedded labels);
Fall 2: Nur eingefügte Datensätze (keine Aktualisierung oder Löschung)
Werden die Daten in der Datenquelle anders als in einer einfach Log-Datei angehängt, reicht die Lösung in Fall 1 nicht aus. Das Problem kann dennoch mit ein wenig mehr Aufwand gelöst werden. Folgende Bedingungen müssen erfüllt sein:
-
Die Datenquelle kann eine beliebige sein.
-
QlikView liest nur die Datensätze ein, die nach der letzten Ausführung des Skripts neu angelegt wurden.
-
Es existiert ein Feld, das ein Änderungsdatum oder ähnliches enthält und anhand dessen QlikView erkennt, welche Datensätze neu sind.
Beispiel:
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;
(Die Hash-Zeichen, in der SQL WHERE-Bedingung definieren den Anfang und das Ende eines Datums. Im Datenbank-Handbuch finden Sie die korrekte Datums-Syntax für Ihre Datenbank.)
Fall 3: Neu eingefügte und aktualisierte Datensätze (kein Löschen)
In diesem Fall wurden bestehende Datensätze seit der letzten Ausführung des Skripts geändert. Folgende Bedingungen müssen erfüllt sein:
-
Die Datenquelle kann eine beliebige sein.
-
QlikView liest nur die Datensätze ein, die nach der letzten Ausführung des Skripts neu angelegt oder geändert wurden.
-
Es existiert ein Feld, das ein Änderungsdatum oder ähnliches enthält und anhand dessen QlikView erkennt, welche Datensätze neu sind.
-
Ein Primärschlüssel wird benötigt, anhand dessen QlikView geänderte Datensätze in der QVD-Datei erkennt.
-
Diese Lösung bewirkt einen Wechsel zum Lese-Standardmodus für die QVD-Datei (statt des optimierten Modus), der bedeutend schneller als verläuft als das Laden der gesamten Datenbank.
Beispiel:
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;
Fall 4: Neu eingefügte, aktualisierte und gelöschte Datensätze
Dies ist der komplizierteste Fall, denn hier wurden seit der letzten Ausführung des Skripts zusätzlich Datensätze gelöscht. Folgende Bedingungen müssen erfüllt sein:
-
Die Datenquelle kann eine beliebige sein.
-
QlikView liest nur die Datensätze ein, die nach der letzten Ausführung des Skripts neu angelegt oder geändert wurden.
-
QlikView entfernt Datensätze, die nach der letzten Ausführung des Skripts aus der Datenbank gelöscht wurden.
-
Es existiert ein Feld, das ein Änderungsdatum oder ähnliches enthält und anhand dessen QlikView erkennt, welche Datensätze neu sind.
-
Ein Primärschlüssel wird benötigt, anhand dessen QlikView geänderte Datensätze in der QVD-Datei erkennt.
-
Diese Lösung bewirkt einen Wechsel zum Lese-Standardmodus für die QVD-Datei (statt des optimierten Modus), der bedeutend schneller als verläuft als das Laden der gesamten Datenbank.
Beispiel:
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