Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database Oracle中的临时表与全局临时表有什么区别?_Database_Oracle_Temp Tables - Fatal编程技术网

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