Рассмотрим пример:
SELECT department_id, job_id,manager_id, SUM(salary) FROM employees
|
Этот запрос заставляет сервер 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) FROM employees GROUP BY department_id,job_id, manager_id UNION ALL SELECT department_id, TO_CHAR(NULL),TO_NUMBER(NULL), SUM(salary) FROM employees GROUP BY department_id UNION ALL SELECT TO_NUMBER(NULL), TO_CHAR(NULL),TO_NUMBER(NULL), SUM(salary) FROM employees
|
В отсутствие оптимизатора, который просматривает блоки запроса для создания плана выполнения, предыдущему запросу понадобилось бы три сканирования базовой таблицы EMPLOYEES
. Это может быть очень неэффективно. Следовательно, рекомендуется использовать составные столбцы.
Далее: Обзор манипулирования данными