Oracle 临时表功能介绍:
Oracle中的临时表是全局的,需要在数据库设计时创建完成,而不是程序使用时。每个登陆用户都使用这一个相同的临时表,但互相之间看不到彼此的数据,也就是说临时表是会话独立的。并且不产生日志。
Oracle 的临时表分为事务型和会话型。
事务型临时表就是指在事务处理过程中插入的记录只在事务提交或回滚之前有效,一旦事务完成,表中的记录便被自动清除。
会话型临时表指临时表中的数据在本次会话期间一直有效,直到会话结束。会话结束后表中针对此次会话的数据会自动清空。
Oracle 临时表的不足之处:
1、不支持lob对象,例如 Spatial 的SDO_GEOMETRY。这也许是设计者基于运行效率的考虑,但实际应用中确实需要此功能时就无法使用临时表了。
2、不支持主外键关系。这意味着临时表
创建临时表的语法:
CREATE GLOBAL TEMPORARY TABLE table
"(" column datatype [DEFAULT expr] [{ NULL | NOT NULL}]
[, column datatype [DEFAULT expr] [ {NULL | NOT NULL} ]... ")"
ON COMMIT {DELETE | PRESERVE } ROWS ;
--Sample
CREATE GLOBAL TEMPORARY TABLE TABLE_NAME (
COL1 VARCHAR2(10),
COL2 NUMBER
) ON COMMIT PRESERVE(DELETE) ROWS ;
如果选择PRESERVE ROWS,则在会话结束后表中的数据自动清空,如果选了DELETE ROWS,则在提交的时候即清空数据,PRESERVE则一直到会话结束。
Oracle中的临时表有两种一种是事务级别的临时表它在事务结束的时候自动清空记录,另一种是会话级的它在我们访问数据库是的一个会话结束后自动的清空。关于临时表多用户并行不是问题,一个会话从来不会阻止另一个会话使用临时表。即使“锁定”临时表,一个会话也不会阻止其他会话使用它们的临时表。
如果有在SQL SERVER 和/或sybase中使用临时表的经验,需要主要考虑的不是执行select x,y ,z into #temp from some_table 来创建和装载临时表,而是:
1.对于每一个数据库,创建所有的temp表作为全局临时表。这将作为应用程序安装的一部分完成,就像创建永久表一样。
2.只要在过程中简单的insert into temp(x,y,z) selelct x,y,z from some_table。
只是理解这点,这里的目的不是运行存储过程创建表。在Oracle中这样做不是正确的方法。DDL是一种消耗资源非常大的操作,在运行时尽量不要使用,应用程序需要的临时表应在应用程序安装时创建,而不是在运行时创建。Oracle中的临时表和其他数据库的临时表是相似的,在每个数据库中创建临时表一次,不必在数据库中的每个存储过程中创建一次。临时表总是存在的,他们作为对象存在于数据字典中,并且总是保持为空,直到有会话在其中放入数据。
所有我在这里说明如果我们在存储过程中建临时表,每次都建立一个那么我的系统随着用户的操作调用此存储过程,每次多一个这样的表,我们在不知不觉中数据库中的表的数量会越来越多,而我们还不知道会存在很大的隐患的所有说这点不可小视,为了我们的系统能在客户那里平稳、安全的运行我们一定要注意这样的问题。如果不手动Drop 表,临时表还是在数据字典中存在的。
临时表空间组介绍
Temporary Tablespace Groups
Oracle Database 10g introduced the concept of a temporary tablespace group. Rather than having just one temporary tablespace and the possibility that it may become a performance bottleneck, you can define an entire group of temporary tablespaces and spread temporary tablespace input/output across them. To create a group of temporary tablespaces, simply specify the GROUP clause when creating it. Both of the following tablespaces comprise a temporary tablespace group named temp_group01:
CREATE TEMPORARY TABLESPACE temp01 TEMPFILE '/oradata/db01/
temp01.dbf' SIZE 100M
EXTENT MANAGEMENT LOCAL UNIFORM SIZE 16M TABLESPACE GROUP temp_group01;
CREATE TEMPORARY TABLESPACE temp02 TEMPFILE '/oradata/db02/
temp02.dbf' SIZE 100M
EXTENT MANAGEMENT LOCAL UNIFORM SIZE 16M TABLESPACE GROUP temp_group01;
Having created a group of temporary tablespaces, you can now make that group the default source of temporary disk space for your database, as follows:
ALTER DATABASE DEFAULT TEMPORARY TABLESPACE temp_group01;
Now, rather than have all temporary input/output go against a single temporary tablespace, the database can distribute that I/O load among all the temporary tablespaces in the group. Temporary tablespace groups are even more of an advantage when you are performing operations in parallel. If you issue an ORDER BY query against a partitioned table and if multiple execution server processes are started in order to process that query in parallel, one for each partition, those execution servers no longer need to all funnel to the same temporary tablespace. Instead, the execution servers will be distributed across all the temporary tablespaces in the active group.
在 oracle 10g 中,可以创建多个临时表空间,并把它们组成一个临时表空间组,这样应用
数据用于排序时可以使用组里的多个临时表空间,一个临时表空间组至少有一个临时表空
间,其最大个数没有限制,组的名字不能和其中某个表空间的名字相同。
临时表空间组是在创建临时表空间时通过指定group字句创建的,如果删除组中的全部
临时表空间,那么这个组也将消失。
我们将可以将一个表空间从一个组移动另一个组,或是从一个组中删除临时表空间,或是往
组里添加新的表空间。
使用临时表空间组,有如下的优点:
1.避免当临时表空间不足时所引起的磁盘排序问题;
2.当一个用户同时有多个会话时,可以使得它们使用不同的临时表空间;
3.使得并行的服务器在单节点上,能使用多个临时表空间 .
现在就看看如何操作使用临时表空间组:
1:创建临时表空间组:
2 ' /home/oracle/temp1_02.dbf ' size 2M tablespace group group1;
Tablespace created
SQL > create temporary tablespace tempts2 tempfile
2 ' /home/oracle/temp2_02.dbf ' size 2M tablespace group group2;
Tablespace created
GROUP_NAME TABLESPACE_NAME
-- ---------------------------- ------------------------------
GROUP1 TEMPTS1
GROUP2 TEMPTS2
SQL >
Tablespace altered
SQL > select * from dba_tablespace_groups;
GROUP_NAME TABLESPACE_NAME
-- ---------------------------- ------------------------------
GROUP2 TEMPTS1
GROUP2 TEMPTS2
SQL >
User altered
SQL >
Database altered.
SQL >
Tablespace dropped
SQL > select * from dba_tablespace_groups;
GROUP_NAME TABLESPACE_NAME
-- ---------------------------- ------------------------------
GROUP2 TEMPTS2
SQL > drop tablespace tempts2 including contents and datafiles;
Tablespace dropped
SQL > select * from dba_tablespace_groups;
GROUP_NAME TABLESPACE_NAME
-- ---------------------------- ------------------------------
SQL >