临时表建立在全局上,所有会话都可以访问,但其中的行数据是被插入行的会话所持有的,开发人员可将它们做为私有存储区来操纵数据,不同用户只能操纵自己的行数据,谁都看不到其他人的行。
临时表的创建语法如下:
create global temporary table <temp_table_name>
(column datatype[, column datatype])
[on commit {delete | preserve} rows];
末尾的可选子句确定了插入行的生命周期。默认方式是在插入行的事务完成之时,删除相应的行。但也可以改变此行为,以便将行数据保留到插入行的会话结束为止。
临时表不支持主外键关系。临时表上也不会有DML锁,因为临时表数据是被会话私有的。可以为临时表创建索引、约束和触发器,可以在视图和同义词中引用它,可以与其他表链接。临时表的数据是临时的,专用于相应的会话,针对其执行的所有SQL的速度远比在永久表上快。
临时表操作速度快的原因有以下几点:
1、临时表不是永久表空间中的段,理想状态下,它们仅存在于使用它们的会话的PGA中,因此不涉及磁盘活动,甚至不涉及数据库缓冲区缓存的活动。
2、如果PGA无法容纳临时表,则将数据写出到临时表空间的临时段中。而临时表空间上的I/O远比永久表空间上的I/O速度快,因为前者不涉及数据库缓冲区缓存,而全部由会话的服务器进程直接在磁盘上执行。
3、针对临时表的DML几乎不生成重做数据,这使得其DML操作更快。
临时表的应用场景如在一个会话中将查询到的记录存放在临时表中,以便可以重复调用,当会话断开时,数据自动清空。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/28974745/viewspace-2145921/ ,如需转载,请注明出处,否则将追究法律责任。