В чем разница между временной таблицей и глобальной временной таблицей в Oracle? - PullRequest
29 голосов
/ 06 января 2009

Я слышал, что эти два термина "временная таблица" и "глобальная временная таблица" в значительной степени используются в аналогичном контексте.

В чем разница между этими двумя?

Ответы [ 6 ]

54 голосов
/ 06 января 2009

В Oracle нет никакой разницы. Когда вы создаете временную таблицу в базе данных Oracle, она автоматически становится глобальной, и вам необходимо включить ключевое слово «Global».

Стандарт SQL, который определяет, как интерпретируется термин «ГЛОБАЛЬНАЯ ВРЕМЕННАЯ ТАБЛИЦА», допускает ЛОКАЛЬНУЮ или ГЛОБАЛЬНУЮ область. Это позволило бы использовать либо пользовательскую таблицу (LOCAL), либо всех (GLOBAL). Oracle реализует только GLOBAL версию.

Данные, которые вы помещаете во Временную таблицу Oracle, относятся к вашей сессии. То есть только вы можете видеть свои данные, даже если все 100 пользователей используют одну и ту же таблицу, и ваши данные удаляются из таблицы при отключении (или при фиксации текущей транзакции) в зависимости от настроек таблицы.

Сравните это с MS SQL-Server, где временные таблицы являются локальными. Если вы создаете его, никто кроме вас не знает, что ваша временная таблица существует. В Oracle создание временной таблицы позволяет всем (и всем, кто имеет доступ к вашей схеме) видеть эту таблицу. Когда вы выходите из сеанса, таблица SQL-Server удаляется, и ее необходимо будет создать заново для следующего сеанса. В Oracle временная таблица теперь является постоянной частью вашей схемы, даже если данные не являются.

7 голосов
/ 30 апреля 2010

Сравните это с MS SQL-Server, где временные таблицы являются локальными. Если вы создаете его, никто кроме вас не знает, что ваша временная таблица существует. В Oracle создание временной таблицы позволяет всем (и всем, кто имеет доступ к вашей схеме) видеть эту таблицу. Когда вы выходите из сеанса, таблица SQL-Server удаляется, и ее необходимо будет создать заново для следующего сеанса. В Oracle временная таблица теперь является постоянной частью вашей схемы, даже если данные отсутствуют (если нет, вы можете решить, сохранять ли ее). Oracle поддерживает только глобальные временные таблицы, избавляя вас от необходимости создавать таблицы в каждом сеансе; он «существует», но он пуст, и его содержимое является уникальным (и частным) для каждого сеанса.

6 голосов
/ 07 января 2009

Имейте в виду, что глобальная временная таблица не имеет статистики, связанной с ней, поэтому посмотрите, должен ли быть установлен динамический уровень выборки для экземпляра, чтобы гарантировать, что неанализированные таблицы будут выбраны во время анализа. В противном случае эвристика может привести к неприятному плану выполнения.

2 голосов
/ 18 февраля 2018

Просто чтобы добавить к существующим ответам о локальных и глобальных временных таблицах, из Oracle 18c будет действительно "Частные временные таблицы" :

Частные временные таблицы - это временные объекты базы данных, которые автоматически удаляются в конце транзакции или сеанса. Частная временная таблица хранится в памяти и видна только сеансу, который ее создал.

Частная временная таблица ограничивает область действия временной таблицы сеансом или транзакцией, обеспечивая таким образом большую гибкость в кодировании приложений, что приводит к упрощению обслуживания кода и улучшению готовых к использованию функциональных возможностей.

Демонстрация из Oracle Live SQL: частные временные таблицы 18c :

-- Private temporary tables must be prefixed as per the database parameter 
-- 'private_temp_table_prefix' 

create private temporary table ORA$PTT_MY_TT ( x int );

-- The table is truly private. 
-- It does not even exist in the the data dictionary, only your session 

-- By default, the moment you commit, the table ceases to exist 
commit;

select * from ORA$PTT_MY_TT;
-- ORA-00942: table or view does not exist

-- This can be changed by specifying that the definition should be preserved 
create private temporary table ORA$PTT_MY_TT ( x int )  
on commit preserve definition;

insert into ORA$PTT_MY_TT  
select rownum from dual  
connect by level <= 30;

commit;

select count(*) from ORA$PTT_MY_TT;
-- 30 

дБ <> Fiddle demo

2 голосов
/ 07 января 2009

Кроме того, Oracle (глобальные) временные таблицы очень полезны, когда каждый из ваших пользователей / сеансов должен видеть различный набор данных. Просто вставьте записи в вашу глобальную временную таблицу и позвольте Oracle управлять хранением одного пользователя из набора другого, а также очисткой. Вам не нужно запрашивать их с помощью идентификатора пользователя, идентификатора сеанса или чего-либо еще.

Мы находим их очень удобными.

0 голосов
/ 05 июня 2014

Нет временной таблицы, только глобальная временная таблица. Идея глобальной временной таблицы состоит в том, что определение существует и может быть просмотрено всеми, но данные являются частными для каждого сеанса. Вы также можете настроить очистку данных при фиксации или только после завершения сеанса.

...