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

时间:2009-01-06 19:22:24

标签: database oracle temp-tables

我听过这两个术语“临时表”和“全局临时表”几乎在类似的上下文中使用过。

两者有什么区别?

6 个答案:

答案 0 :(得分:54)

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

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

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

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

答案 1 :(得分:7)

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

答案 2 :(得分:6)

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

答案 3 :(得分:2)

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

我们发现它们非常方便。

答案 4 :(得分:2)

只需添加有关本地和全球临时表的现有答案,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

答案 5 :(得分:0)

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