Загрузка новых и обновленных записей с помощью инкрементальной загрузки

Если приложение содержит большое количество данных из постоянно обновляющихся исходных баз данных, перезагрузка набора данных полностью может занять много времени. В этом случае из базы данных загружаются только новые или измененные записи, все остальные данные должны быть уже доступны в приложении. Для этого можно использовать инкрементальную загрузку с помощью файлов QVD.

Основной процесс приведен ниже:

  1. Загрузите новые или обновленные данные из исходной таблицы базы данных.

    Это медленный процесс, но загружается только определенное число записей.

  2. Загрузите уже доступные данные приложения из файла QVD.

    Загружается много записей, но это намного более быстрый процесс.

  3. Создайте новый файл QVD.

    Данный файл можно использовать для последующих инкрементальных загрузок.

  4. Повторите процедуру для каждой загружаемой таблицы.

Ниже приведены примеры случаев использования инкрементальной загрузки. Однако в зависимости от структуры исходной базы данных и режима работы может потребоваться более сложное решение.

  • Только добавить (обычно используется для файлов журнала)
  • Только вставить (без обновления или удаления)
  • Вставить и обновить (без удаления)
  • Вставить, обновить и удалить

Вы можете прочитать файлы QVD как в оптимизированном, так и в стандартном режиме. (Используемый метод выбирается подсистемой Qlik Sense автоматически в зависимости от сложности действия.) Оптимизированный режим приблизительно в 10 раз быстрее стандартного режима и в 100 раз быстрее загрузки базы данных обычным способом.

Для получения дополнительной информации см. Работа с файлами QVD.

Только добавить

Простейшим случаем являются файлы журнала, в которых записи лишь добавляются, но никогда не удаляются. Применяются следующие условия:

  • База данных должна являться файлом журнала (или другим файлом, в который записи добавляются, но не вставляются и не удаляются), который содержится в текстовом файле (ODBC, OLE DB или другие базы данных не поддерживаются).

  • Qlik Sense следит за числом записей, которые были прочитаны ранее, и загружает только те записи, которые были добавлены в конце файла.

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

Только вставить (без обновления или удаления)

Если данные находятся в базе данных, не являющейся простым файлом журнала, случай с добавлением не будет работать. Однако проблему можно решить с минимальными дополнительными усилиями. Применяются следующие условия:

  • Источником данных может быть любая база данных.

  • Qlik Sense загружает записи, вставленные в базу данных после выполнения последнего скрипта.

  • Поле ModificationTime (или похожее) требуется для распознавания новых записей программой Qlik Sense.

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;

 

Символы случайных значений в предложении SQL WHERE определяют начало и конец даты. Правильный синтаксис даты в базе данных см. в руководстве по базе данных.

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

 

Символы случайных значений в предложении SQL WHERE определяют начало и конец даты. Правильный синтаксис даты в базе данных см. в руководстве по базе данных.

Вставить и обновить (без удаления)

Следующий случай применяется, если данные в ранее загруженных записях в процессе выполнения скрипта могли измениться. Применяются следующие условия:

  • Источником данных может быть любая база данных.

  • Qlik Sense загружает записи, вставленные в базу данных или обновленные в базе данных после выполнения последнего скрипта.

  • Поле ModificationTime (или похожее) требуется для распознавания новых записей программой Qlik Sense.

  • Поле первичного ключа требуется для сортировки программой Qlik Sense обновленных записей из файла QVD.

  • Это решение переведет чтение файла QVD в стандартный режим (а не в оптимизированный режим), что все равно значительно быстрее загрузки всей базы данных.

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

Вставить, обновить и удалить

В самом сложном случае записи действительно удаляются из базы данных в процессе выполнения скрипта. Применяются следующие условия:

  • Источником данных может быть любая база данных.

  • Qlik Sense загружает записи, вставленные в базу данных или обновленные в базе данных после выполнения последнего скрипта.

  • Qlik Sense удаляет записи, удаленные из базы данных после выполнения последнего скрипта.

  • Поле ModificationTime (или похожее) требуется для распознавания новых записей программой Qlik Sense.

  • Поле первичного ключа требуется для сортировки программой Qlik Sense обновленных записей из файла QVD.

  • Это решение переведет чтение файла QVD в стандартный режим (а не в оптимизированный режим), что все равно значительно быстрее загрузки всей базы данных.

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