Виайс,
Datacons
Управление временными таблицами в Oracle 8i
(Managing Oracle 8i Temporary Tables, by Vijays)
Источник: Reveal Net Pipeline Newsletter, том 2 выпуск 2
февраль 2001, http://www.revealnet.com/newsletter-v2/temporary_tables.htm
Управление временными таблицами
Определение, задающее структуру временной таблицы, подобно определению обычной таблицы, но данные, которые в ней содержащатся, существуют лишь в течение транзакции или сессии. Используемые в Oracle8i временные таблицы предназначены для хранения промежуточных, частных данных каких-либо сессий. Вы сами выбираете, что данные определены на сессию или на транзакцию.
Приведем несколько примеров, когда выгодно применение временных таблиц:
Web-приложение резервирования
авиабилетов позволяет Вам, клиенту, рассмотреть несколько возможных маршрутов.
Выбранные данные каждого маршрута приложение хранит в строке временной таблицы.
Если Вы изменяете какой-либо маршрут, приложение изменяет соответствующую
строку. Когда Вы окончательно выбираете желаемый маршрут, приложение переносит
эту строку в постоянную таблицу. Таким образом, в течение Вашей сессии все
рассматриваемые данные имеют частный характер, и, когда сессия заканчивается,
все отвегнутые маршруты уничтожаются.
Несколько торговых агентов крупного
книжного поставщика для оформления клиентских заказов по телефону одновременно
используют единую временную таблицу. При вводе или изменении клиентских заявок
каждый агент работает с таблицей сессии, и эти данные не доступны для других
агентов. Когда агент завершпет свою сессию, данные этой сессии автоматически
удаляются, но структура таблицы сохраняется для использования остальными
агентами.
Администратор использует временные
таблицы, чтобы повысить производительность прохождения неких сложных или
ресурсоемких запросов. Для этого администратор кеширует во временных таблицах
результаты наиболее сложных запросов, когда запускаются такие SQL-предложения,
как соединения (joins).
Создание временных таблиц
Создание временной таблицы производится с использованием специальных ключеных слов ANSI. Определение существующих в течение сессии данных делается при помощи фразы ON COMMIT PRESERVE ROWS, а существующих только в течение транзакции - ON COMMIT DELETE ROWS.
CREATE GLOBAL TEMPORARY TABLE ...
[ON COMMIT PRESERVE ROWS ]
CREATE GLOBAL TEMPORARY TABLE ...
[ON COMMIT DELETE ROWS ]
Использование временных таблиц
На временных таблицах также как на постоянных таблицах можно создавать индексы.
Граница логических сессионных чтений (session gets) из сессионной временной таблицы определяется первой в нее вставкой (insert) во время сессии. Граница сохраняется до конца сессии или до выдачи команды TRUNCATE для данной таблицы в данной сессии.
Граница логических транзакционных чтений из транзакционной временной таблицы определяется первой в нее вставкой во время транзакции. Граница сохраняется до конца транзакции.
Над существующей временной таблицей разрешается выполнение DDL-предложений (за исключением TRUNCATE) только, если в настоящий момент нет ни одной сессии, одновременно связанной с этой временной таблицей. В отличие от постоянных таблиц, при создании временных таблиц и их индексов сегменты автоматически не выделяются. Сегменты выделяются только, когда выполняется первое предложение INSERT (или CREATE TABLE AS SELECT). Это означает, что, если предложения SELECT, UPDATE или DELETE выполняются перед первым INSERT таблица остается пустой.
Временные сегменты освобождаются в конце транзакции для транзакционых временных таблиц и в конце сессии для сессионных временных таблиц.
Если транзакция заканчивается откатом, введенные данные теряются, хотя определение таблицы сохраняется.
Нельзя создать таблицу, которая одновременно являлась бы и транзакционной, и сессионной.
Транзакционная временная таблица обслуживает одновременно только одну транзакцию. Если в рамках одной транзакции порождается несколько автономных транзакций, каждая автономная транзакция может использовать таблицу, если только предыдущая транзакция завершилась.
Поскольку данные во временной таблице, по определению,
временные, резервирование (backup) не производится и восстановление (recovery)
данных временной таблицы в случае отказа системы невозможно. Чтобы быть готовым
к такому отказу системы, Вам необходимо применять альтернативные методы
сохранения временных табличных данных.
Сессионная временная таблица
Следующее предложение создает сессионную временную таблицу, FLIGHT_SCHEDULE, которая используется в автоматизированной системе резервирования авиабилетов. Каждый клиент заводит свою собственную сессию и может хранить временные списки. Эти временные списки удаляются в конце сессии.
CREATE GLOBAL TEMPORARY TABLE flight_schedule (
startdate DATE,
enddate DATE,
cost NUMBER)
ON COMMIT PRESERVE ROWS;