Oracle中的临时表与全局临时表有啥区别?

Posted

技术标签:

【中文标题】Oracle中的临时表与全局临时表有啥区别?【英文标题】:What is the difference between a temporary table vs global temporary table in Oracle?Oracle中的临时表与全局临时表有什么区别? 【发布时间】:2010-09-29 21:16:44 【问题描述】:

我听说“临时表”和“全局临时表”这两个术语在类似的上下文中使用得非常相似。

两者有什么区别?

【问题讨论】:

很高兴知道:可以在 Oracle 中的全局临时表上创建索引。 也很高兴知道:从索引表执行 CREATE GLOBAL TEMPORARY TABLE AS SELECT 时,已经在现有(永久)表上创建的索引会自动出现。 【参考方案1】:

只是为了添加关于本地和全局临时表的现有答案,来自Oracle 18c 将有真正的"Private Temporary Tables":

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

私有临时表将临时表的范围限制在会话或事务中,从而为应用程序编码提供更大的灵活性,从而使代码维护更容易,并提供更好的即用型功能。

来自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 demo

【讨论】:

【参考方案2】:

没有临时表,只有全局临时表。 全局临时表的想法是定义存在并且所有人都可以看到,但数据对于每个会话都是私有的。您还可以配置是在提交时清除数据还是仅在会话结束时清除数据。

【讨论】:

【参考方案3】:

与 MS SQL-Server 相比,临时表是本地的。如果您创建一个,除了您之外没有人知道您的临时表存在。在 Oracle 中,创建临时表允许每个人(以及有权访问您的模式的每个人)查看该表。当您注销会话时,SQL-Server 表将被删除,并且需要为下一个会话重新创建。在 Oracle 中,临时表现在是模式的永久部分,即使数据不是(如果不是,您可以决定是否保留它)。 Oracle 只支持全局临时表,使您不必在每个会话中创建表;它“存在”但它是空的,并且它的内容在每个会话中都是唯一的(并且是私有的)。

【讨论】:

在我们的企业中,我们发现 DROP 然后重新创建全局临时表以用于我们的报告目的是明智的(我们使用 SQR),因为我们使用的临时表是从其他表创建为 SELECT系统。如果这些表发生变化,那么我们可以确保我们的临时表与它们匹配。【参考方案4】:

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

【讨论】:

【参考方案5】:

此外,当您的每个用户/会话都需要查看不同的数据集时,Oracle(全局)临时表非常非常有用。只需将记录插入到您的全局临时表中,让 Oracle 管理将一个用户的集合与另一个用户的集合以及清理工作保持一致。您无需使用用户 ID、会话 ID 或其他任何内容来查询它们。

我们发现它们非常方便。

【讨论】:

【参考方案6】:

在 Oracle 中没有任何区别。当您在 Oracle 数据库中创建临时表时,它自动是全局的,您需要包含“全局”关键字。

定义术语“GLOBAL TEMPORARY TABLE”如何解释的 SQL 标准允许使用 LOCAL 或 GLOBAL 范围。这将允许用户特定表 (LOCAL) 或每个人 (GLOBAL)。 Oracle 仅实现 GLOBAL 版本。

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

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

【讨论】:

啊……知道了。 Informix 提供本地临时表;您必须在每个会话中创建它们,但任何人都可以这样做。全局临时表使您不必在每个会话中创建表;它“存在”但它是空的,并且每个会话的内容都是唯一的(和私有的)。谢谢。

以上是关于Oracle中的临时表与全局临时表有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 表变量和临时表的区别

oracle 在存储过程中动态的建一个临时表使用和在数据库里写死一个临时表使用两者有啥区别?

使用视图和临时表之间有啥区别(系统资源方面)?

临时表或普通表有啥更好的方法?

临时表和游标的使用小总结

在sqlserver中临时TMP表有啥作用?里面储存的都是啥数据?