Рассмотрим пример:

SELECT department_id, job_id,manager_id, SUM(salary) |
Этот запрос заставляет сервер Oracle вычислить следующие группирования:
(
job_id
,manager_id
)(
department_id
,job_id
,manager_id
)(
department_id
)Общий итог
Если интересуют только конкретные группы, без использования составных столбцов не удастся ограничить вычисления только этими группированиями. Использование составных столбцов позволяет при свертке рассматривать столбцы JOB_ID
и MANAGER_ID
как единый блок. Столбцы, заключенные в скобки, при вычислении ROLLUP
и CUBE
рассматриваются как единый блок. Это объединение иллюстрируется примером, приведенным на рисунке.
Заключение столбцов JOB_ID
и MANAGER_ID
в скобки указывает серверу Oracle рассматривать JOB_ID
и MANAGER_ID
как один блок, т.е. как составной столбец.
В примере, показанном на рисунке, вычисляются следующие группирования:
(
department_id
,job_id
,manager_id
)(
department_id
)( )
Приведенный пример выводит следующие результаты:
суммарный оклад для каждой должности и каждого менеджера (помечено как 1);
суммарный оклад для каждого подразделения, каждой должности и каждого менеджера (помечено как 2);
суммарный оклад для каждого подразделения (помечено как 3);
общий итог (помечено как 4).
Приведенный на рисунке пример также может быть получен следующим образом:
SELECT department_id, job_id, manager_id, SUM(salary) |
В отсутствие оптимизатора, который просматривает блоки запроса для создания плана выполнения, предыдущему запросу понадобилось бы три сканирования базовой таблицы EMPLOYEES
. Это может быть очень неэффективно. Следовательно, рекомендуется использовать составные столбцы.