Oracle中临时表和全局临时表有什么区别?

30

我听过这两个术语“临时表”和“全局临时表”,它们在很多情况下用法相似。

它们两者之间有什么区别呢?


1
好知道:在Oracle中,可以在全局临时表上创建索引。 - tuinstoel
1
还有需要知道的是:在现有(永久)表上创建的索引会在从已索引的表执行CREATE GLOBAL TEMPORARY TABLE AS SELECT时自动传递。 - noogrub
6个回答

55

在Oracle中,临时表没有任何区别。当您在Oracle数据库中创建临时表时,它会自动成为全局表,并且您需要包括"Global"关键字。

SQL标准定义了如何解释“GLOBAL TEMPORARY TABLE”一词,允许使用本地或全局范围。这将允许用户特定表(LOCAL)或所有人(GLOBAL)。Oracle仅实现全局版本。

您放入Oracle临时表中的数据仅限于您的会话。也就是说,即使有100个用户都在使用同一个表,只有您可以看到您的数据,并且根据表的设置,在断开连接(或提交当前事务)时从表中删除您的数据。

与MS SQL-Server相比,临时表是本地的。如果您创建一个,除了您之外,没有人知道您的临时表存在。在Oracle中,创建临时表允许每个人(具有访问您模式的权限的人)查看表格。当您注销会话时,SQL-Server表被删除,并需要重新创建以供下一个会话使用。在Oracle中,临时表现在是模式的永久部分,即使数据不是。


3
啊……明白了。Informix 提供本地临时表;你需要在每个会话中创建它们,但任何人都可以这样做。全局临时表使你无需在每个会话中创建表;它“存在”,但是它是空的,并且其内容对于每个会话来说是独特的(且私有的)。谢谢。 - Jonathan Leffler

7
与 MS SQL-Server 不同的是,临时表在 Oracle 中是全局的。如果您创建了一个临时表,在您的模式下有权访问该表的所有人都可以看到它。而在 MS SQL-Server 中,创建临时表后,只有您自己知道它的存在。当您退出会话后,SQL-Server 表将被删除,并需要重新创建以供下一个会话使用。在 Oracle 中,即使数据不是永久的(如果不需要保留),临时表也是模式的永久部分。 Oracle 仅支持全局临时表,这样您就无需在每个会话中创建表;它“存在”,但是它是空的,并且其内容对于每个会话都是唯一的(并且私有的)。

在我们的企业中,为了报告目的,我们发现删除并重新创建全局临时表是明智的(我们使用SQR),因为我们使用的临时表是从系统中的其他表创建的。如果这些表发生变化,那么我们可以确保我们的临时表与它们匹配。 - noogrub

6

关于本地和全局临时表的现有答案,从Oracle 18c开始,将会真正存在"私有临时表"

私有临时表是自动在事务或会话结束时删除的临时数据库对象。私有临时表存储在内存中,仅对创建它的会话可见。

私有临时表将临时表的范围限制为会话或事务,因此在应用程序编码中提供了更大的灵活性,导致更容易维护代码和更好的即用功能。

Oracle Live SQL: 18c private temporary tables演示:

-- 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 

db<>fiddle演示


6

请注意,全局临时表没有与之相关联的统计信息,因此请检查实例的动态采样级别是否应设置,以确保在解析时对未分析的表进行采样。否则,启发式方法可能会导致不良的执行计划。


2
此外,Oracle(全球)临时表在每个用户/会话需要查看不同的数据集时非常有用。只需将记录插入到全局临时表中,让Oracle管理保持一个用户的数据集不受另一个用户干扰,并进行清理。您不需要使用用户ID、会话ID或其他信息来查询它们。我们发现它们非常方便。

0
临时表是不存在的,只有全局临时表。 全局临时表的概念是定义存在并可被所有人看到,但数据对每个会话是私有的。您还可以配置数据在提交后清除还是在会话结束时清除。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接