Я слышал, что эти два термина «временная таблица» и «глобальная временная таблица» используются почти в одном контексте.
Какая разница между двумя?
Я слышал, что эти два термина «временная таблица» и «глобальная временная таблица» используются почти в одном контексте.
Какая разница между двумя?
В Oracle нет никакой разницы. Когда вы создаете временную таблицу в базе данных Oracle, она автоматически становится глобальной, и вам необходимо включить ключевое слово «Глобальная».
Стандарт SQL, который определяет, как интерпретируется термин «ГЛОБАЛЬНАЯ ВРЕМЕННАЯ ТАБЛИЦА», допускает либо ЛОКАЛЬНУЮ, либо ГЛОБАЛЬНУЮ область действия. Это позволит использовать таблицу для конкретного пользователя (LOCAL) или для всех (GLOBAL). Oracle реализует только ГЛОБАЛЬНУЮ версию.
Данные, которые вы помещаете во временную таблицу Oracle, зависят от вашего сеанса. То есть только вы можете видеть свои данные, даже если 100 пользователей используют одну и ту же таблицу, и ваши данные удаляются из таблицы при отключении (или при совершении текущей транзакции) в зависимости от настроек таблицы.
Сравните это с MS SQL-Server, где временные таблицы являются локальными. Если вы создадите ее, никто, кроме вас, не узнает, что ваша временная таблица существует. В Oracle создание временной таблицы позволяет всем (точнее, всем, у кого есть доступ к вашей схеме) видеть таблицу. Когда вы выходите из сеанса, таблица SQL-Server удаляется, и ее необходимо будет создать заново для следующего сеанса. В Oracle временная таблица теперь является постоянной частью вашей схемы, даже если данные ею не являются.
Сравните это с MS SQL-Server, где временные таблицы являются локальными. Если вы создадите ее, никто, кроме вас, не узнает, что ваша временная таблица существует. В Oracle создание временной таблицы позволяет всем (точнее, всем, у кого есть доступ к вашей схеме) видеть таблицу. Когда вы выходите из сеанса, таблица SQL-Server удаляется, и ее необходимо будет создать заново для следующего сеанса. В Oracle временная таблица теперь является постоянной частью вашей схемы, даже если данные не являются (если нет, вы можете решить, сохранять ли ее). Oracle поддерживает только глобальную временную таблицу, что избавляет вас от необходимости создавать таблицу в каждом сеансе; он «существует», но он пуст, и его содержимое уникально (и приватно) для каждого сеанса.
Имейте в виду, что глобальная временная таблица не имеет связанной с ней статистики, поэтому проверьте, должен ли быть установлен уровень динамической выборки для экземпляра, чтобы обеспечить выборку неанализируемых таблиц во время синтаксического анализа. В противном случае эвристика может привести к скверному плану выполнения.
Просто чтобы добавить к существующим ответам о локальных и глобальных временных таблицах, от 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
Кроме того, временные таблицы Oracle (глобальные) очень полезны, когда каждому из ваших пользователей/сеансов необходимо видеть разные наборы данных. Просто ВСТАВЬТЕ записи в свою глобальную временную таблицу и позвольте Oracle управлять набором одного пользователя от другого, а также очисткой. Вам не нужно запрашивать их с идентификатором пользователя, идентификатором сеанса или чем-то еще.
Мы находим их очень удобными.
Там нет временной таблицы, только глобальная временная таблица. Идея глобальной временной таблицы заключается в том, что определение существует и может быть просмотрено всеми, но данные являются частными для каждого сеанса. Вы также можете настроить, очищаются ли данные при фиксации или только после завершения сеанса.