Перейти к содержанию

Генерация SQL запроса

Витрина представляет собой декларативное описание набора данных: сам запрос формируется системой на основе состава витрины, уровней агрегации, фильтров и её настроек. Один и тот же сгенерированный запрос используется и при проверке витрины, и для объекта, создаваемого в базе данных, поэтому понимание принципов его сборки объясняет вид результата.

Из чего строится запрос

Часть витрины Влияние на запрос
Факты и первичные измерения Считываются напрямую из подключённого источника, который разбирается на подключение, таблицу и колонку
Расчётные элементы — расчётные показатели, производные факты и производные измерения Их формулы транслируются в SQL-выражения по правилам языка формул
Уровни агрегации Определяют поля, по которым группируется показатель
Фильтры Превращаются в условия, ограничивающие набор возвращаемых записей
Скрытые элементы Участвуют в фильтрации и расчётах, но не попадают в возвращаемые колонки
Справочники Присоединяются к таблице фактов по первичным и внешним ключам, заданным в связи между ними

Как собирается запрос

  • Набор участвующих таблиц определяется по подключённым источникам всех элементов, после чего выбирается базовая таблица для оператора FROM. Приоритет отдаётся таблицам показателей; при их отсутствии используются таблицы внешних ключей справочников
  • Справочники присоединяются через LEFT JOIN по парам первичных и внешних ключей, заданным их связями с таблицами фактов
  • Показатель, в формуле которого нет агрегатной функции, встраивается как обычная колонка запроса. Если такая формула содержит собственное условие, колонка оборачивается так, чтобы значение возвращалось только для строк, удовлетворяющих условию, а для остальных возвращался NULL
  • Показатель с уровнем агрегации рассчитывается в отдельном подзапросе, группирующем данные по полям этого уровня. Затем подзапрос присоединяется к основному запросу по ключам агрегации
  • Фильтр, условие которого ссылается на расчётный элемент, сначала разворачивается: ссылка заменяется SQL-выражением формулы этого элемента
  • Запрос форматируется под диалект целевой базы данных. Если целевую базу данных определить невозможно, запрос генерируется для PostgreSQL

Вид запроса в зависимости от конфигурации витрины

Конфигурация Вид запроса
Одна таблица фактов, все колонки из одной таблицы Прямой запрос SELECT ... FROM ...
Одна таблица фактов, колонки из нескольких таблиц Запрос с LEFT JOIN к справочникам и подзапросами для агрегированных показателей
Одна таблица фактов, группировка со справочниками и без явных уровней агрегации Двухуровневый запрос: внутренняя часть агрегирует данные по внешним ключам, внешняя присоединяет справочники для получения значений измерений. Это сокращает число соединений, выполняемых при агрегации
Несколько таблиц фактов, «UNION» По одному запросу на каждую таблицу фактов; отсутствующие в таблице фактов колонки заменяются на NULL, а к набору колонок добавляется служебная колонка «fact» с названием таблицы фактов. Запросы объединяются через UNION ALL
Несколько таблиц фактов, «JOIN» По одному подзапросу на каждую таблицу фактов с её измерениями и показателями плюс подзапрос с уникальными комбинациями значений измерений. Результат формируется присоединением подзапросов таблиц фактов к этому набору комбинаций, а общие показатели рассчитываются поверх них

Результаты и постраничный просмотр

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

Ограничения

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