February 25, 2021

Быстрый способ получить уникальные значения поля в Qlik Sense

Проблема

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

Например, для создания мастер-календаря нам нужно найти минимальную и максимальную дату в таблице. Таблица может быть очень большой — сотни миллионов или миллиарды строк.

Решение

Самый быстрый способ — обратиться к внутренним индексным таблицам, в которых Qlik хранит уникальные значения для каждого поля. Это можно сделать с помощью функции FieldValue(). Это на порядки быстрее, чем грузить данные напрямую через LOAD DISTINCT ... RESIDENT.

Proof of Concept

Возьмем для примера таблицу. В ней 300М строк с числами от 1 до 100.

Таблица с одним полем А на 300 млн. строк со значениями от 0 до 99.

Наша задача найти минимальное и максимальное значения в этой таблице.

Вариант 1. LOAD DISTINCT ... RESIDENT -> 2 минуты 36 секунд

Код выполняется 2:36 минут

В этом варианте Qlik при загрузке данных из Temp вынужден перелопатить все 300М записей, чтобы загрузить из них только уникальные значения. Это долго.

Вариант 2. FieldValue() ... AUTOGENERATE FieldValueCount() -> 0 секунд

Код выполняется меньше секунды

В этом случае Qlik проходит только по своей внутренней индексной таблице с уникальными значениями поля, которых всего 100 штук, а не 300 миллионов.
Это происходит мгновенно.

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

Спасибо за лайфхак Евгению Стучалкину!