Ładowanie nowych i zaktualizowanych rekordów za pomocą funkcji ładowania przyrostowego

Jeśli aplikacja zawiera dużą ilość danych z baz danych, które są na bieżąco aktualizowane, przeładowanie całego zestawu danych może być czasochłonne. W takim przypadku wystarczy załadować z takiej bazy danych tylko nowe lub zmienione rekordy, a pozostałe dane powinny już być dostępne w aplikacji. Operację taką umożliwia funkcja ładowania przyrostowego za pomocą plików QVD.

Ogólny proces wygląda następująco:

  1. Załaduj nowe lub zaktualizowane dane z tabeli źródłowej bazy danych.

    Jest to proces powolny, ale ładowana jest tylko ograniczona liczba rekordów.

  2. Załaduj dane już dostępne w aplikacji z pliku QVD.

    Załadowanych zostanie wiele rekordów, ale jest to proces znacznie szybszy.

  3. Utwórz nowy plik QVD.

    Plik ten będzie służyć na potrzeby następnego ładowania przyrostowego.

  4. Powtórz procedurę dla każdej ładowanej tabeli.

W poniższym przykładzie przedstawiono przypadki stosowania funkcji ładowania przyrostowego. Potrzebne może się jednak okazać bardziej kompleksowe rozwiązanie zależne od struktury źródłowej bazy danych i trybu operacji.

  • Tylko dołączanie (zazwyczaj stosowane dla plików dziennika)
  • Tylko wstawianie (bez aktualizowania ani usuwania)
  • Wstawianie i aktualizowanie (bez usuwania)
  • Wstawianie, aktualizowanie i usuwanie

Pliki QVD można odczytywać w trybie zoptymalizowanym i trybie standardowym. (Silnik Qlik Sense automatycznie dokonuje wyboru metody w zależności od złożoności operacji). Tryb zoptymalizowany jest ok. 10 razy szybszy od trybu standardowego, czyli ok. 100 razy szybszy od zwykłego ładowania danych z bazy danych.

Więcej informacji zawiera temat Praca z plikami QVD.

Tylko dołączanie

Najprostszy przypadek dotyczy obsługi plików dziennika, do których wiersze są jedynie dołączane, bez usuwania. Obowiązują następujące warunki:

  • Bazą danych musi być plik dziennika (lub inny plik, do którego wiersze są jedynie dołączane, bez wstawiania ani usuwania) w postaci pliku tekstowego (ODBC, OLE DB lub inne bazy danych nie są obsługiwane).

  • Program Qlik Sense śledzi liczbę wcześniej odczytanych wierszy i ładuje tylko wiersze dodane na końcu pliku.

Example:  

(Windows)

Buffer (Incremental) Load * From LogFile.txt (ansi, txt, delimiter is '\t', embedded labels);

Example:  

(Kubernetes)

Buffer (Incremental) Load * From [lib://MyDataFiles/LogFile.txt] (ansi, txt, delimiter is '\t', embedded labels);

Tylko wstawianie (bez aktualizowania ani usuwania)

Jeśli dane są przechowywane w bazie danych innego rodzaju niż prosty plik dziennika, metoda polegająca tylko na dołączaniu nie będzie działać. Mimo to można taką sytuację rozwiązać przy minimalnym nakładzie dodatkowej pracy. Obowiązują następujące warunki:

  • Źródło danych może być dowolną bazą danych.

  • Program Qlik Sense ładuje wiersze wstawione do bazy danych od czasu ostatniego wykonania skryptu.

  • Pole ModificationTime (lub podobne) jest wymagane, aby program Qlik Sense rozpoznał nowe wiersze.

Example:  

(Windows)

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;

 

Znaki krzyżyka w klauzuli SQL WHERE wyznaczają początek i koniec daty. Informacje o prawidłowej składni zapisu daty w używanej bazie danych można znaleźć w dokumentacji bazy.

Example:  

(Kubernetes)

QV_Table:

SQL SELECT PrimaryKey, X, Y FROM DB_TABLE

WHERE ModificationTime >= #$(LastExecTime)#

AND ModificationTime < #$(BeginningThisExecTime)#;

 

Concatenate LOAD PrimaryKey, X, Y FROM [lib://MyDataFiles/File.QVD];

STORE QV_Table INTO [lib://MyDataFiles/File.QVD];

 

Znaki krzyżyka w klauzuli SQL WHERE wyznaczają początek i koniec daty. Informacje o prawidłowej składni zapisu daty w używanej bazie danych można znaleźć w dokumentacji bazy.

Wstawianie i aktualizowanie (bez usuwania)

Ten przypadek ma zastosowanie, jeśli dane z wcześniej załadowanych wierszy mogły ulec zmianie od czasu wykonania skryptu. Obowiązują następujące warunki:

  • Źródło danych może być dowolną bazą danych.

  • Program Qlik Sense ładuje wiersze wstawione do bazy danych lub zaktualizowane w bazie danych od czasu ostatniego wykonania skryptu.

  • Pole ModificationTime (lub podobne) jest wymagane, aby program Qlik Sense rozpoznał nowe wiersze.

  • Wymagane jest pole klucza głównego, aby program Qlik Sense mógł zidentyfikować zaktualizowane rekordy w pliku QVD.

  • Zastosowane rozwiązanie wymaga odczytu pliku QVD w trybie standardowym (a nie zoptymalizowanym), co jednak i tak będzie znacznie szybsze od ładowania całej bazy danych.

Example:  

(Windows)

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);

WHERE NOT Exists(PrimaryKey);

 

STORE QV_Table INTO File.QVD;

Example:  

(Kubernetes)

QV_Table:

SQL SELECT PrimaryKey, X, Y FROM DB_TABLE

WHERE ModificationTime >= #$(LastExecTime)#;

 

WHERE NOT Exists(PrimaryKey);

Concatenate LOAD PrimaryKey, X, Y FROM [lib://MyDataFiles/File.QVD];

WHERE NOT Exists(PrimaryKey);

 

STORE QV_Table INTO [lib://MyDataFiles/File.QVD];

Wstawianie, aktualizowanie i usuwanie

Najtrudniejszym do obsłużenia przypadkiem jest sytuacja, w której wiersze są usuwane z bazy danych między kolejnymi wykonaniami skryptu. Obowiązują następujące warunki:

  • Źródło danych może być dowolną bazą danych.

  • Program Qlik Sense ładuje wiersze wstawione do bazy danych lub zaktualizowane w bazie danych od czasu ostatniego wykonania skryptu.

  • Program Qlik Sense usuwa wiersze usunięte z bazy danych od czasu ostatniego wykonania skryptu.

  • Pole ModificationTime (lub podobne) jest wymagane, aby program Qlik Sense rozpoznał nowe wiersze.

  • Wymagane jest pole klucza głównego, aby program Qlik Sense mógł zidentyfikować zaktualizowane rekordy w pliku QVD.

  • Zastosowane rozwiązanie wymaga odczytu pliku QVD w trybie standardowym (a nie zoptymalizowanym), co jednak i tak będzie znacznie szybsze od ładowania całej bazy danych.

Example:  

(Windows)

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

Example:  

(Kubernetes)

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://MyDataFiles/File.QVD]

WHERE NOT EXISTS(PrimaryKey);

 

Inner Join SQL SELECT PrimaryKey FROM DB_TABLE;

 

If ScriptErrorCount = 0 then

STORE QV_Table INTO [lib://MyDataFiles/File.QVD];

Let LastExecTime = ThisExecTime;

End If