我听过这两个术语“临时表”和“全局临时表”,它们在很多情况下用法相似。
它们两者之间有什么区别呢?
我听过这两个术语“临时表”和“全局临时表”,它们在很多情况下用法相似。
它们两者之间有什么区别呢?
在Oracle中,临时表没有任何区别。当您在Oracle数据库中创建临时表时,它会自动成为全局表,并且您需要包括"Global"关键字。
SQL标准定义了如何解释“GLOBAL TEMPORARY TABLE”一词,允许使用本地或全局范围。这将允许用户特定表(LOCAL)或所有人(GLOBAL)。Oracle仅实现全局版本。
您放入Oracle临时表中的数据仅限于您的会话。也就是说,即使有100个用户都在使用同一个表,只有您可以看到您的数据,并且根据表的设置,在断开连接(或提交当前事务)时从表中删除您的数据。
与MS SQL-Server相比,临时表是本地的。如果您创建一个,除了您之外,没有人知道您的临时表存在。在Oracle中,创建临时表允许每个人(具有访问您模式的权限的人)查看表格。当您注销会话时,SQL-Server表被删除,并需要重新创建以供下一个会话使用。在Oracle中,临时表现在是模式的永久部分,即使数据不是。
关于本地和全局临时表的现有答案,从Oracle 18c
开始,将会真正存在"私有临时表":
私有临时表是自动在事务或会话结束时删除的临时数据库对象。私有临时表存储在内存中,仅对创建它的会话可见。
私有临时表将临时表的范围限制为会话或事务,因此在应用程序编码中提供了更大的灵活性,导致更容易维护代码和更好的即用功能。
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
请注意,全局临时表没有与之相关联的统计信息,因此请检查实例的动态采样级别是否应设置,以确保在解析时对未分析的表进行采样。否则,启发式方法可能会导致不良的执行计划。