Выводимые таблицы с хранимым результатом. Часть 1Владимир Пржиялковский
СодержаниеВведениеДанные, удаленные по сети, равно как и данные в очень больших таблицах нередко оказываются неудобными для приложения: или к ним долго обращаться, или доступ к ним ненадежен, или и то и другое вместе. Одно из решений Oracle, позволяющее отчасти сгладить такое неудобство - выводимые таблицы с хранимым результатом (materialized views). Они позволяют построить хранимую локально выжимку исходных данных, и уже эффективность обращения к этой выжимке не отличается от обычных таблиц. В данной статье рассматриваются механизмы построения materialized views в распределенных БД и в БД для складов данных. Во второй части статьи будут рассматриваться различные механизмы обновления хранимого результата с целью его синхронизации с обновлениями исходных данных. Общие положенияРазновидности выводимых таблиц ("виртуальных", "вторичных"; "представлений") в Oracle:
В отличие от большинства других видов объектов, materialized views (за исключением одной их разновидности) не являются функционально самостоятельным видом объектов и чаще всего их функциональность может моделироваться вручную с помощью аппарата триггеров и системного пакета DBMS_JOB. В этом случае их использование просто повышает уровень абстракции при программировании БД в Oracle. Некоторые основные свойстваMaterialized views, так же как и обычные именованные выводимые таблицы, являются с точки зрения словаря-справочника Oracle хранимыми объектами и создаются, изменяются и удаляются SQL-командами CREATE, ALTER и DROP, например: CREATE MATERIALIZED VIEW имя [ENABLE QUERY REWRITE] AS SELECT ...
Кроме этого materialized views могут характеризоваться другими важными для этих объектов признаками:
В целом materialized views характеризуются следующими группами свойств:
Все свойства этих групп формулируются собственными синтаксическими конструкциями в предложениях CREATE/ALTER MATERIALIZED VIEW Справочная информацияСведения об имеющихся выводимых таблицах с хранимым результатом и их свойства хранятся в системных USER/ALL/DBA_-таблицах с подстрокой MVIEW в имени, например USER_MVIEWS Часть свойств materialized views в этих таблицах унаследована от выводимых таблиц (обновляемость), часть от хранимых таблиц (внутренняя организация, организация хранения, а часть свойств является собственными (схемы обновления хранимого результата). В то же время при работе с materialized views в схеме автоматически создаются специальные служебные объекты (таблицы, индексы). Сведения о них доступны из "обычных" справочных таблиц, в первую очередь из USER_OBJECTS. Подготовка примераВ примерах далее будет использована стандартная схема SCOTT. Для дальнейшей работы пользователю SCOTT нужно дать от имени SYS привилегию создавать materialized view: GRANT CREATE SNAPSHOT TO scott; Некоторые типичные примерыНиже приводятся примеры построения materialized views нескольких важных категорий. Построение в рамках распределенной БД: тиражирование данныхЭта разновидность materialized views в ранних версиях Oracle существовала под названием snapshots. В ряде случаев Oracle продолжает поддерживать старое название snapshot на равных правах с более поздним materialized view. Возможны два варианта использования materialized views для тиражирования данных: одностороннее тиражирование (хранимый результат доступен для выборки и закрыт для изменений приложением) и двустороннее тиражирование (хранимый результат может изменяться приложением). Для простоты здесь будет рассматриваться первый вариант, одностороннего тиражирования. Подготовка примераДля иллюстрации использования materialized view для тиражирования данных необходимо перевести БД на глобальную систему имен и создать связь с удаленной БД. Назначим для БД REM_BASE домен CLASS. Пусть логическое имя соединения с этой БД - REMOTE_DB. (1) Проставим в INIT.ORA DB_DOMAIN="class" и перезапустим СУБД для этой базы по этому файлу параметров (2) Выдадим от имени SYS в REM_BASE: ALTER DATABASE RENAME GLOBAL_NAME TO rem_base.class; (3) Выдадим от имени SCOTT в локальной БД: CREATE DATABASE LINK rem_base.class Убедиться, что созданная связь работает, можно выдав: SELECT * FROM emp@rem_base.class; Построение примераВыдадим от имени SCOTT: CREATE MATERIALIZED VIEW loc_emp AS Появившиеся в результате новые объекты схемы SCOTT можно посмотреть так: SELECT object_name, object_type FROM user_objects; Просмотр "локальных" данных об "удаленных" сотрудниках: SELECT * FROM loc_emp; Построение в рамках одной схемы: подмена запросаЭта разновидность materialized view может создаваться только на основе таблицы, находящейся в той же схеме. Кроме этого, для ее создания нужно иметь особую привилегию QUERY REWRITE. Подготовка примераВыдадим от имени SYS: GRANT QUERY REWRITE TO scott; Построение примераВыдадим в SQL*Plus от имени SCOTT: CREATE MATERIALIZED VIEW dept_salaries (В следующем примере и в двух далее одинаковым фоном выделены одинаковые участки кода). Выводимая таблица DEPT_SALARIES показывает список отделов, число работающих в них и фонд зарплаты. Число отделов: SELECT COUNT(*) FROM dept_salaries; Проверка работы переформулировкиПроанализируем таблицы (желательно) и сравним планы: ANALYZE TABLE emp COMPUTE STATISTICS; SET AUTOTRACE TRACEONLY EXPLAIN
ALTER SESSION SET QUERY_REWRITE_ENABLED=TRUE;
Два последних оператора SELECT идентичны. Пример показывает, что мы можем продолжать работать с исходными таблицами независимо от того, построена выводимая таблица DEPT_SALARIES, или нет. СУБД сама определила, что таковая имеется, и переадресовала запрос к ней. Сама таблица DEPT_SALARIES не несет в себе новых данных и ее наличие, подобно наличию индекса, позволяет в некоторых случаях сократить время доступа к исходной информации. Следующие примеры свидетельствуют, что для подобной автоматической переадресации к данным в приложении не обязательно повторять в точности формулировку имеющейся выводимой таблицы. Достаточно, чтобы в выводимой таблице с хранимым результатом хватало данных для ответа:
SELECT dname, COUNT(emp.deptno) emp_count, SUM(sal) tot_sal Построение в рамках одной БДВыводимые таблицы с хранимым результатом могут использоваться не только в распределенной среде или для повышения скорости доступа к большим таблицам, например: CREATE MATERIALIZED VIEW jobsal AS Мотивом для такого создания могут служить попытки найти в Oracle технические решения для конкретных манипуляций с данными в БД. |