Database Oracle中的临时表与全局临时表有什么区别?
我听说这两个术语“临时表”和“全局临时表”在类似的上下文中使用Database Oracle中的临时表与全局临时表有什么区别?,database,oracle,temp-tables,Database,Oracle,Temp Tables,我听说这两个术语“临时表”和“全局临时表”在类似的上下文中使用 两者之间有什么区别?在Oracle中没有任何区别。在Oracle数据库中创建临时表时,它会自动为全局表,并且需要包含“全局”关键字 SQL标准定义了术语“全局临时表”的解释方式,允许使用局部范围或全局范围。这将允许用户特定的表(本地)或所有人(全局)。Oracle只实现全局版本 放入Oracle临时表的数据特定于会话。也就是说,即使有100个用户都使用同一个表,也只有您可以查看数据,并且在断开连接(或提交当前事务)时,您的数据将从表
两者之间有什么区别?在Oracle中没有任何区别。在Oracle数据库中创建临时表时,它会自动为全局表,并且需要包含“全局”关键字 SQL标准定义了术语“全局临时表”的解释方式,允许使用局部范围或全局范围。这将允许用户特定的表(本地)或所有人(全局)。Oracle只实现全局版本 放入Oracle临时表的数据特定于会话。也就是说,即使有100个用户都使用同一个表,也只有您可以查看数据,并且在断开连接(或提交当前事务)时,您的数据将从表中删除,具体取决于表设置
与之相比,MS SQL Server的临时表是本地的。如果您创建了一个临时表,那么除了您之外没有人知道您的临时表存在。在Oracle中,创建临时表允许所有人(以及所有有权访问您的模式的人)查看该表。注销会话时,SQL Server表将被删除,需要为下一个会话重新创建。在Oracle中,临时表现在是模式的永久部分,即使数据不是 此外,当您的每个用户/会话都需要查看不同的数据集时,Oracle(全局)临时表非常有用。只需将记录插入到全局临时表中,让Oracle管理保持一个用户的集合与另一个用户的集合,以及清理。您不需要使用用户ID、会话ID或其他什么来查询它们
我们发现它们非常方便。请注意,全局临时表没有与之关联的统计信息,因此请查看是否应设置实例的动态采样级别,以确保在解析时对未分析的表进行采样。否则,启发式可能会导致糟糕的执行计划。与MS SQL Server相比,后者的临时表是本地的。如果您创建了一个临时表,那么除了您之外没有人知道您的临时表存在。在Oracle中,创建临时表允许所有人(以及所有有权访问您的模式的人)查看该表。注销会话时,SQL Server表将被删除,需要为下一个会话重新创建。在Oracle中,临时表现在是模式的永久部分,即使数据不是(如果不是,那么您可以决定是否保留它)。
Oracle仅支持全局临时表,使您无需在每个会话中创建表;它“存在”,但它是空的,每个会话的内容都是唯一的(并且是私有的)。没有临时表,只有全局临时表。
全局临时表的概念是定义存在并且可以被所有人看到,但是每个会话的数据都是私有的。您还可以配置是在提交时清理数据,还是仅在会话结束时清理数据。要添加有关本地和全局临时表的现有答案,请从Oracle 18c中选择: 私有临时表是在事务或会话结束时自动删除的临时数据库对象。私有临时表存储在内存中,仅对创建它的会话可见 专用临时表将临时表的范围限制在会话或事务中,从而在应用程序编码中提供了更大的灵活性,从而使代码维护更容易,功能更易于使用。 演示来自:
——必须根据数据库参数为私有临时表添加前缀
--“专用临时表格前缀”
创建私有临时表ORA$PTT\u MY\u TT(x int);
--这张桌子真的很私人。
--它甚至不存在于数据字典中,只存在于您的会话中
--默认情况下,在提交时,表就不再存在
犯罪
从ORA$PTT\u MY\u TT中选择*项;
--ORA-00942:表或视图不存在
--这可以通过指定应保留定义来更改
创建私有临时表ORA$PTT\U MY\U TT(x int)
关于定义;
插入ORA$PTT\u MY\u TT
从dual中选择rownum
按级别连接啊…明白了。Informix提供本地临时表;您必须在每个会话中创建它们,但任何人都可以这样做。全局临时表使您无需在每个会话中创建表;它“存在”,但它是空的,并且每个会话的内容都是唯一的(并且是私有的)。谢谢。在我们的企业中,我们发现删除然后重新创建全局临时表是明智的,因为我们使用的临时表是从系统中的其他表中选择创建的。如果这些表发生更改,我们可以确保我们的临时表与它们匹配。很高兴知道:可以在Oracle中的全局临时表上创建索引。另一个好消息是:当从索引表中选择创建全局临时表时,已经在现有(永久)表上创建的索引会自动出现。
-- 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