SqlServer和Oracle临时表生命周期

时间:2022-09-08 09:04:52

SqlServer:

局部临时表#temp_table:

只在当前会话结有效。会话终止则生存终止。

根据session不同开辟不一样的内存存放数据。

相同session的用户可以使用同一张临时表,只能create table 一次。

不同session建的临时表,即使表名相同,指向的内存也是不一样的,互相内容不可见。

 

全局临时表##temp_table:

顾名思义,不同的session可以使用同一块内存。但是其中的内容到底什么时候才被回收呢?

只要有任何session用到过这个表,且这些session没有被全部终止,就不被回收。

所谓session终止,我的理解,就sqlserver本身来说就是query窗体被关掉。如果是因为有应用程序连接而产生的session的话(以上所说的session都是sqlserver的session),web系就是session重启(IIS application pool重启,这里所说的session是http的session),应用系的话就是充启应用程序了(←猜想,没试过)。

 

Oracle:

ORACLE的临时表在应用系统中有很大的作用,它可以让用户只能够操作各自的数据中而互不干扰,不用担心会破坏或影响其他SESSION/TRANSACTION的数据,这也是数据安全的一种解决方法
临时表分为SESSION、TRANSACTION两种,SESSION级的临时表数据在整个SESSION都存在,直到结束此次SESSION;而TRANSACTION级的临时表数据在TRANACTION结束后消失,即COMMIT/ROLLBACK或结束SESSION都会清除TRANACTION临时表数据。

两种临时表的语法
create global temporary table 临时表名 on commit preserve|delete rows 
用preserve时就是SESSION级的临时表,用delete就是TRANSACTION级的临时表

CREATE GLOBAL TEMPORARY TABLE GT_ONE (
SN NUMBER,
QTY NUMBER
) ON COMMIT DELETE ROWS;

“ON COMMIT DELETE ROWS ” 意思是提交当前事务时删除临时表中的数据。

CREATE GLOBAL TEMPORARY TABLE GT_ONE (
SN NUMBER,
QTY NUMBER
) ON COMMIT PRESERVE ROWS;

“ON COMMIT DELETE ROWS ” 意思是提交当前事务时不删除临时表中的数据。

不论哪种形式,结束会话时都会删除临时表中的数据,在不同的会话中互不影响。