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