Qlik. Оптимизированная загрузка из QVD, или ускоряемся в разы

Время на чтение: 3 мин.

Вступление

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

Моё железо

Для начала описания, чтобы было общее понимание моего железа, для соотношения его с вашим.
Скорее всего у вас неплохие сервера, но всё же…

Процессор: i7-980x – HT – выключен, скорость 4 Ghz, 6 ядер
Материнская плата : ASUS Rampage III Extreme
Оперативная память – Noname 12 Gb DDR3 1333 Mhz
SSD – Samsung 850 EVO 500 Gb

Генерация тестовых данных

Для этой задачи, я создал простой скрипт генерации данных с полями: Товар, Магазин, Дата, Сумма и Количество в 20 млн. строк.

Почему 20 млн. строк? – На таком объеме данных мы сможем увидеть правду в нашем подходе по оптимизации.

В ходе выполнения генерации, процессор был загружен примерно на 25 %

Общая длительность генерации: 01:19, вместе с сохранением файла 01:25

Общий размер QVD:

Тесты по загрузке данных из QVD – 20 млн. строк

Для первой загрузки я ничего не придумывал, результат – 13 секунд.

Тестовый снимок данных

Просто скриншот произвольных данных, которые помогут нам в последующем немного ориентироваться

Проводим тесты по загрузке данных из QVD с фильтрами

#1 WHERE Магазин = ‘Магазин7’ – 7 секунд

#2 WHERE Товар = ‘Товар28’ – 5 секунд

#3 WHERE Товар = ‘Товар28’ AND Магазин = ‘Магазин7’ – 5 секунд

А теперь используем условие EXISTS ()

Для оптимизации выполнения загрузки данных, я буду предварительно генерировать нужные мне данные, а потом по ним уже использовать фильтр Exists

Where Exists (Магазин2, Магазин) – 7 секунд

Скрипт у меня теперь выглядит немного иначе:

Where Exists (Товар2, Товар) – 6 секунд

Где оптимизация? Я ничего не понимаю!

На самом деле такая закономерность имеет место быть и это нормально. В вышеуказанных примерах я показал вам вариант использования EXISTS в котором у вас с трудом получится ускорить загрузку из QVD.

Для примера вывел количество DISTINCT значений полей:

Теперь то всё ясно! Делаем правильно!

Итак, правильным решением, для оптимизации будет решение использования EXISTS с одним и тем же полем.

Смотрим скрипт:

Результат: 3 секунды, неплохо да? Сравниваем с вариантами выше (Where и Exists(Магазин2, Магазин)) – разница в 2 раза (примерно), но она есть!

Проверяем с товаром: Результат тот же, 3 секунды – прекрасно!

Для размышления и самостоятельного тестирования

Я показал вам лишь малую часть, которую можно провести с вашими скриптами – только по загрузке QVD файлов.

На самом деле способов не один, и даже не два – вот за что я люблю Qlik. Для решения любой задачи – всегда есть больше 1 варианта.

Просто представьте, например у вас есть 700 файлов, по 20 Мб каждый (а это на минуточку – 14Gb) – факты по продажам товаров, разбитые на каждый день и вам нужно из этих файлов быстро выдернуть данные по каким-то определенным полям? Ну или прогнать в цикле загрузку этих файлов и что-то с ними сделать ….

Резюме

Ищите нестандартные подходы, практикуйтесь использовать разные варианты в решении одних и тех же задач. По моему опыту использования Where Exits() – я получал приросты по времени и в 30 и даже 60 минут, вместо использования Where.

Заключение

Всем Qlik