msgbartop
Блог Oracle разработчика
msgbarbottom
foxbase

10.06.2010 Временные таблицы Oracle

Временные таблицы Oracle (global temporary table) это хороший инструмент для быстрого выполнения сложных вычислительных операций. Как следует из их названия это действительно таблицы, данные в которых хранятся временно, а именно существуют только во время жизни сессии пользователя. Операции с временными таблицами могут выполняться намного быстрее операций с обычными таблицами. Это происходит вследствие того, что временные таблицы Oracle создаются во временном сегменте данных Oracle и для них не генерируется информация в сегментах отката, фактически они создаются в режиме nologging и, по возможности, данные таких таблиц сервером Oracle стараются удерживаться в памяти.
Основное применение временных таблиц Oracle это выполнение промежуточных расчетов для сложных вычислительных задач. Часто бывает проще и быстрее выбрать некоторые данные во временную таблицу и затем выполнять запросы к полученным данным. 
Основные свойства временных таблиц Oracle:
  • Данные во временной таблице существуют только во время сессии пользователя
  • В зависимости от типа временной таблицы данные в ней могут удаляться при выполнении фиксации или отката транзакции (опция при создании таблицы on commit delete rows), либо при при завершении сессии пользователя (опция on commit preserve rows)
  • Данные, добавленные пользователем в таблицу, никогда не будут видны другими пользователями.
  • Можно создавать индексы для столбцов временной таблицы, которые физически будут расположены во временном табличном пространстве. 
Пример создания временной таблицы, данные которой автоматически удаляются только по окончании сессии пользователя:

create global temporary table TMP_TBL
(
  COL_1 number,
  COL2 date,
)
on commit preserve rows;

Пример создания временной таблицы, данные которой автоматически удаляются либо при окончании сессии пользователя, либо при  выполнении фиксации (commit) или отката (rollback) транзакции в течение сессии пользователя:

create global temporary table TMP_TBL
(
  COL_1 number,
  COL2 date,
)
on commit delete rows;

Временные таблицы Oracle имеют следующие ограничения:
  • Временная таблица не может быть index-organized (организованной по индексу)
  • Временная таблица не может быть кластеризована
  • Временная таблица не может быть разбита на части или партиции
  • Параллельные запросы и распределенные транзакции не могут работать с временными таблицами
  • У временной таблицы Oracle не может быть nested-tables (вложенных таблиц)
  • Невозможно создать внешний ключ на временную таблицу Oracle, а также на обычную таблицу из временной.
  • Временная таблица не может иметь статистику оптимизатора.  
  • Невозможно заблокировать временную таблицу целиком командой lock table, впрочем это и не требуется, так как данные такой таблицы и так доступны только для текущей сессии пользователя. 
Автор видит необходимость использования временных таблиц Oracle для ускорения тех или иных расчетных задач. Многие разработчики приложений так и поступают. Однако использование индексных массивов языка PL/SQL может еще больше ускорить выполнение расчетных задач. С этой технологией можно ознакомиться в статьях  Индексные массивы в Oracle PL/SQL и Сортировка индексных массивов Oracle PL/SQL


Оставьте свой комментарий

Вы должны быть авторизированны, чтобы оставить комментарий.