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

MOZ*_*LLA 29 database oracle temp-tables

我听过这两个术语"临时表"和"全局临时表"在类似的上下文中使用了很多.

两者有什么区别?

Tho*_*Low 54

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

SQL标准定义了术语"GLOBAL TEMPORARY TABLE"的解释方式,它允许LOCAL或GLOBAL范围.这将允许用户特定表(LOCAL)或每个人(GLOBAL).Oracle仅实现GLOBAL版本.

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

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

  • 啊......明白了.Informix提供本地临时表; 你必须在每个会话中创建它们,但任何人都可以这样做.全局临时表使您不必在每个会话中创建表; 它"存在"但它是空的,其内容在每个会话中是唯一的(和私有的).谢谢. (3认同)

小智 7

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


Dav*_*dge 6

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


Luk*_*zda 6

只需添加有关本地和全局临时表的现有答案,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 
Run Code Online (Sandbox Code Playgroud)

db<>小提琴演示