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

Когда актуальна оптимизация индексов ключевых полей:

Исходное ключевое поле, которое требуется оптимизировать, может быть как простым, например датой, числом или простым текстовым полем, так и составным (комплексным). Такое поле может включать комбинацию из нескольких первичных ключевых полей справочников, а также дат, между которыми вставлен символ-разделитель (например «|»).

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

Суть оптимизации:

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

НА ЗАМЕТКУ!

  • Оптимизируемое поле не должно иметь «пробелов».
  • Значения поля не должны быть отрицательными.

Пример оптимизации ключевого поля MAINKEY:

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

Замена в связанных по ключевому полю таблицах старого неоптимального ключевого поля на оптимальное целочисленное ключевое поле выполняется в 3 шага:

  1. Для примера возьмем модель данных, в которой таблицы [Товарные Проводки] и [StarLinkTable] связаны по текстовому комплексному ключевому полю [MAINKEY]. Используя функцию FieldValue() создаем временную таблицу, содержащую старое ключевое поле таблицы, которое требуется заменить, и новое целочисленное ключевое поле, сгенерированное с помощью функции autonumber():

В примере:

[MAINKEY] – старое ключевое поле, для которого выполняется оптимизация,

[%MainKey] – новое целочисленное ключевое поле.

  1. Используя Left Join новое ключевое поле [%MainKey] из временной таблицы tmpData добавляется в каждую из таблиц, содержащих старое ключевое поле [MAINKEY]: 

– пример скрипта для добавления нового ключевого поля [%MainKey] в таблицу  [Товарные Проводки]

– пример скрипта для добавления нового ключевого поля [%MainKey] в таблицу  [StarLinkTable]

  1. После добавления нового ключевого поля [%MainKey] в связанные по старому полю таблицы временная таблица tmpData и старое ключевое поле удаляются [MAINKEY], а новое поле переименовывается в старое:

Источник данных QlikView

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

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