![]() |
Вы находитесь на страницах старой версии сайта. Перейдите на новую версию OLAP.ru |
![]() | ||||||
Поиск по сайту | ||||||
![]() | ||||||
Новости | ||||||
![]() | ||||||
Основы OLAP | ||||||
![]() | ||||||
Продукты | ||||||
![]() | ||||||
Business Objects/ Crystal Decisions | ||||||
![]() | ||||||
Каталог | ||||||
![]() | ||||||
OLAP в жизни | ||||||
![]() | ||||||
Тенденции | ||||||
![]() | ||||||
Download | ||||||
![]() | ||||||
| ||||||
![]() | ||||||
CUBE, ROLLUP и "материализованные" представления: "добывая" золото OracleДжон Джей Кинг, Oracle Magazine/RU Online, #8/2000 ВведениеСУБД Oracle8i предоставляет новые средства, которые снижают ресурсоемкость запросов с суммированием (summary queries) и в целом значительно упрощают эти операции. Применение опций CUBE и ROLLUP во фразе GROUP BY запроса позволяет производить функционально более полные операции суммирования. CUBE и ROLLUP предоставляют информацию, которую в ином случае можно можно было получить только посредством дополнительных запросов или кодирования. Воспользовавшись "материализованными" представлениями (Materialized Views) можно предварительно создавать часто используемые таблицы итогов (to pre-build tables of summary data). Результаты типовых операций суммирования в материализованных представлениях могут быть проиндексированы, обеспечивая тем самым ускорение выполнения типовых запросов. Материализованные представления могут быть обновлены (refreshed ) тем же способом, что и снапшоты (Snapshots) с частотой нужной пользователям. Использование CUBE и ROLLUP в материализованных представлениях совместно с другими возможностями GROUP BY обеспечивает получение более полной информации при выполнении менее ресурсоемких запросов. Все коды примеров этой статьи были протестированы с Oracle 8.1.5. Oracle8i Release 2 (Oracle version 8.1.6) должна выйти вскоре после написания этой статьи, новинки этого релиза только упоминаются, к сожалению, никакие примеры этих новинок недоступны в настоящее время. Некоторые из наиболее важных усовершенствований нового релиза Oracle8i - это аналитические ("Analytic") функции, позволяющие производить ранжирование (ranking), перенос сводных результатов (moving aggregates), сравнение данных за различные периоды (period comparisons), соотношение итогов (ratio of total), получение совокупных сводных результатов (cumulative aggregates), добавление фразы ORDER BY к определениям материализованных представлений и другие функции. Фраза GROUP BY (без CUBE или ROLLUP)Следующий запрос показывает "нормальную" функциональность GROUP BY. Оператор SQL сортирует детальные данные, используя столбцы, указанные в GROUP BY, затем вычисляет подытоги и результаты - одна строка для каждой группы. SQL> select deptno Department DEPARTMENT JOB Total SAL CUBE и ROLLUP во фразе GROUP BYДеловым людям для принятия решений часто требуются статистическая информация из базы данных. Возрастающий интерес к добыче данных (data-mining - или же "интеллектуальный анализ данных" - ИАД) требует средств более высокого уровня их агрегирования. Oracle8i предоставляет опции CUBE и ROLLUP, чтобы расширить возможности GROUP BY посредством возможности выполнения следующих действий:
Функция GROUP BY в стандарте языка SQL позволяет агрегацию (подведение подытогов) по некоторому заданному столбцу или набору столбцов. До появления Oracle8i в SQL-операторах требовалось применение JOIN или UNION для комбинирования информации подытогов (одна строка результата на группу строк детальных данных) и окончательных итогов (одна строка результата на весь набор строк) в одном SQL-запросе. ROLLUP позволяет создавать подытоги и окончательные итоги в одном и том же запросе совместно с получением промежуточных подытогов на каждом уровне агрегирования. CUBE добавляет информацию для кросс-табличных отчетов на основе столбцов группировки GROUP BY. Все примеры в этой статье были созданы с предоставленными корпорацией Oracle таблицами примера SCOTT/TIGER. Выполните процедуру DEMOBLD со своим userid для создания личных копий этих таблиц. Все примеры должны работать как показано. Этот запрос вычисляет сумму зарплат для групп служащих, отсортированных по отделам и должностям. Например, сумма зарплат клерков (CLERKs) в отделе 10 (Department 10) вычисляется отдельно от суммы зарплат клерков в отделе 20. Заметьте, что сумма зарплат для всех должностей в отделе 10 не показана, так же как и общая сумма всех зарплат. GROUP BY с опцией ROLLUPROLLUP обеспечивает агрегирование на каждом уровне, заданном столбцами в GROUP BY. Это приводит к получению информации, которую нельзя было получить раньше без дополнительного кодирования. Следующий оператор показывает это: SQL> col Department format a20
Отметим, что ROLLUP создает подытоги для каждого возможного уровня (Подытоги по отделам) и общий итог. Например, международная фирма, производящая спортивные товары, вычисляет суммы продаж с использованием столбцов GROUP BY, а именно Country (Страна), Customer_ID (номер клиента), Product (Товар). GROUP BY стандартно вычислит агрегаты (подытоги) для каждой уникальной комбинации этих трех столбцок, показывая агрегаты для каждого товара заказанного каждым клиентом в каждой стране. Country Customer_ID Product Sales ROLLUP добавляет агрегаты, показывающие сумму продаж товаров в разрезе по странам и номерам клиентов, общая сумма продаж по странам и сумму продаж всех товаров. Country Customer_ID Product Sales
Функция GROUPINGДля того, чтобы улучшить обработку NULL-значений в строках, созданных ROLLUP (и CUBE - это обсуждается позже), корпорация Oracle представила новую функцию GROUPING, которая возвращает значение 1, если строка - это подытог, созданная ROLLUP или CUBE, и 0 в противном случае. Пример ниже показывает запрос, уже использованный ранее, с функциями DECODE и GROUPING, применение которых позволяет более элегантно обрабатывать null-значения, созданные ROLLUP и CUBE. (Внимание: данные примера не содержат null-значения, результаты этого запроса и предыдущего одни и те же). SQL> col Department format a20 В этом примере подытоги по отделам и общие итоги теперь имеют больше специфических заголовков и значений. Так как ROLLUP генерирует строку с суммой зарплат всех служащих (независимо от должности) в отделе, в этом примере используется "All Employees" (Все служащие) чтобы показать этот подытог вместо наименования должности. Когда ROLLUP генерирует сумму зарплат по всем отделам (общий итог), столбец отдела покажет "Whole Company" (Вся компания) вместо номера конкретного отдела. GROUP BY с опцией CUBEВ дополнение к групповым подытогам и общим итогам, созданным ROLLUP, CUBE автоматически вычисляет все возможные комбинации возможных подытогов. Это предоставляет агрегированную, просуммированную информацию для каждой категории. Пример ниже показывает запрос, ранее уже использованный, но с функцией CUBE для получения дополнительной агрегированной информации: SQL> col Department format a20 DEPARTMENT JOB Total SAL В ранее приведенном примере с CUBE вся информация, полученная при применении ROLLUP (предыдущий пример), соединяется при выводе с подытогами для каждой комбинации категорий (столбцов GROUP BY). Итоговые данные по зарплате для каждой профессии добавляются к уже полученным данным. Окончательные итоги приведены в категории "Whole Company" ("Вся компания"), так как в них учтены данные каждого служащего заданной профессии независимо от отдела. Country Customer_ID Product Sales Информация, получаемая функцией CUBE полезна в кросс-табличных итоговых отчетах, Материализованные представления (Oracle8i)Oracle-механизм снапшота (SNAPSHOT) - это таблица результатов некоторого запроса, которая периодически создается для облегчения распределения или репликации данных. Механизм "материализованное представление" (materialized view) в Oracle8i использует аналогичную технологию для хранения результатов некоторого представления, которые как бы материализованы в базе данных для использования последующими SQL-предложениями. Это материализованное представление периодически обновляется: по требованию или по временному критерию, заданному при создании представления. Данные представления являются "старыми", пока это представление не обновится. Для материализованных представлений могут быть определены индексы. Это идеальный механизм для улучшения производительности часто выполняемых отчетов, запускаемых для получения агрегированной информации. create materialized view dept_summary Эта технология является расширением технологии снапшотов, впервые реализованной в Oracle 7. Механизм обновления и схемы индексирования надежны и эффективны. Далее приведено краткое описание параметров, более подробную информацию смотрите в документации по Oracle:
AS описывает запрос, используемый для создания материализованного представления, почти каждый запрос может быть использован с учетом нескольких ограничений, например:
Запрос может включать GROUP BY, CUBE, ROLLUP, операции соединения, вложенные запросы (динамические представления) и почти любую другую конструцию; Oracle8i Release 2 (8.1.6) позволяет запросу содержать фразу ORDER BY и for INSERT...SELECT в материализованном представлении, что также оговаривается ORDER BY.
Использование предварительно построенных таблицОпределение материализованного представления на существующей таблице (ON PREBUILT TABLE) позволяет использовать существующие таблицы и индексы. drop table dept_summary_tab; Использование фразы ON PREBUILT TABLE требует, чтобы исходная таблица и материализованное представление использовали одни и те же имя и схему. WITH REDUCED PRECISION позволяет обновлению работать должным образом, даже если некоторые столбцы генерируют значения с точностью, отличной от той, что была первоначально определена. Будьте осторожны! Эта процедура фиксирует (COMMITs) изменения активной транзакции как часть своей функциональности. select dname,ename,sal,sal/tot_sal pct_dept ЗаключениеВ этой статье рассматриваются опции CUBE и ROLLUP (в Oracle8I) в фразе GROUP BY и материализованные представления. Использование CUBE и ROLLUP сокращает работу, необходимую для кодирования и создания агрегированной информации, часто требуемой руководством. Итоговые данные часто необходимы для поддержки принятия решений руководством. Использование CUBE и ROLLUP обеспечивает механизм для применения одного SQL-предложения, которое предоставляет данные, которые ранее можно было получить, используя множество SQL-предложений, программирование или ручное суммирование. Материализованные представления сокращают ресурсоемкость часто выполняемых запросов для получения агрегированной информации, сохраняя результаты и обновляя их на периодической основе. Используемые вместе, все эти средства могут применяться для "раскапывания" в базах данных Oracle "золотой" информации, которая столь часто необходима в наше время. Об автореДжон Кинг (John Jay King) партнер King Training Resources, фирмы, осуществляющей с 1988 обучение в США и других странах. Джон работал с продуктами Oracle, начиная с Version 4, обучал разработчиков приложений еще Oracle Version 5. Его доклады звучали на различных конференциях, включая IOUG-A Live!, UKOUG Conference, EOUG Conference, ECO/SEOUC, RMOUG Training Days и ODTUG conference.
© 2001 Interface Ltd |