表如其名,临时的,意思就是不会永久存在,只在某一个时间段存在的表。而临时表空间就是专门用来建立这类表开辟的表空间。它和普通表空间同样有大小,有文件位置,甚至他的内部组成结构也和普通表空间一致,唯一不一致的是,它在逻辑概念上是背分配给临时表使用的,它需要管理临时表,因此它具有因为是临时表的管理者应该又的特性。而它的特性大概都是因为需要满足临时表的特性而产生的。所以无法避免要首先谈论什么是临时表。
在前面我们谈论过一些临时表,但那不是真正的临时表,而是普通表用来充当临时表的用途,他只在使用者的逻辑概念中被认为是临时表,但在oracle环境中他仍然是被认定为普通表,所以他不具有oracle自己提供的管理临时表的功能,而需要使用者自定义如何管理临时表。这当然不是高效的有或者说是符合oracle规范的使用表的方式,至少在管理临时表上面,没有oracle自己更会管理临时表了。如果能用自带的,为什么还要一个充满累赘的普通表来做临时表。
相较于临时表,普通表在很多设计上是累赘的,因为临时的特性,在数据安全上可以做出一点让步,至少临时表的回滚日志是比普通表少的,而且临时表在失效后会立马清楚空间,不产生日志。这样做完全是为了将临时这个概念在oracle中得到实现,也可以说理解oracle世界的临时观,有助于使用真正的临时表。
在oracle中,临时表可以分为两种,一种是自建的临时表,另外一种是系统在执行dsl语句时,因为一次操作无法得到最终结果,会将中间结果放到一个临时表中,随着语句的执行完毕,该数据将被清楚,特别常见的就是在pga区的排序操作。临时表空间都运行在pga区,一个全局共享内存区。这样的好处在于方便管理临时表跟连接与事物之间的关系,因为pga区是和用户相关的,pga区是oracle和外部连接的第一个区,他管理和保留所有用户连接与事务信息。话说回来,另外一种自建的临时表分为两种,一种是global session全局回话临时表,它的意思是面向连接的临时表,只有当连接断开,临时表才失效。另外一种是global transaction全局事务临时表,它的意思是面向事务的临时表,只要事务被commit或者rollback,表舅失效。他们也运行在pga区。
所有临时表都是面向用户的,也就是每一个链接,每一个单独的事务,它都可以单独拥有一个只面向它的临时表,虽然他们使用的同一个全局临时表,但在使用时,里面的数据只对当前事务或链接可见,其他连接也只能使用自己的数据,这样的好处在于,它能够支持并发,因为数据相互独立,所以不用担心多线程竞争同一份数据的可能,临时表可以说是在处理一些中间事件时独一无二的最佳选择,特别是追求高并发的性能的时候。唯一美中不足的是它不支持分区,如果能把计算好的数据进行迁移,那就非常完美了。
相对于临时表来说,临时表空间一样继承了临时的一些特性,例如它也是面向用户的,在定义临时表的时候,可以指定哪些用户对哪些临时表空间可见,可以定义临时表空间组,这样可以方便管理临时表空间。实际上在正常的生产上,临时表空间一般不是很大,本来就是临时的,没用的时候他就是空闲状态,浪费资源。所以在使用临时表的时候,需要注意这样一点,数据量尽量不要太大。
关于pga区,最常见的就是排序操作了,要注意pga的大小和临时表空间的关系,因为pga如果放不下,就是放在临时表空间里面。临时表最佳使用场景应该是需要一个中间保存数据缓解,就像oracle自己执行的时候一样,最终数据要嘛输出,要嘛落地上普通表的情况。用脑壳想想其实还是有很多地方可以大有作为的。