Использование файлов QVD для инкрементальной нагрузки

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

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

1. Загрузите новые данные из таблицы базы данных (процесс происходит медленно, но загружается ограниченное число записей).

2. Загрузите старые данные из файла QVD (загружается много записей, но процесс происходит значительно быстрее).

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

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

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

1) Случай 1: Только добавить (как правило, файлы протокола

2) Случай 2: Только вставить (без обновления или удаления)

3) Случай 3: Вставить и обновить (без удаления)

4) Случай 4: Вставить, обновить и удалить

Ниже для каждого из этих решений находятся перечисленные решения. Чтение файлов QVD может происходить в «оптимизированном режиме» или «стандартном режиме». (Выбор необходимого режима выполняется обработчиком скриптов QlikView автоматически в зависимости от степени сложности операции.) Оптимизированный режим приблизительно в 10 раз быстрее стандартного режима и в 100 раз быстрее загрузки базы данных обычным способом.

Случай 1: Только добавить

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

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

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

Example:  

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

Случай 2: Только вставить (без обновления или удаления)

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

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

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

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

Example:  

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 загружает записи, вставленные в базу данных или обновленные в базе данных после выполнения последнего скрипта

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

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

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

Example:  

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 удаляет записи, удаленные из базы данных после выполнения последнего скрипта.

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

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

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

Example:  

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