热衷技术,热爱交流
分类: Oracle
2013-06-16 20:53:35
Temporary Tables
1. 临时表就是为会话或者事务创建的表。对于会话级别的临时表,会话结束时候,临时表就被truncate,对于事务级别的临时表,事务提交或者回滚时候 被truncate。on commit关键字用于确定是哪种临时表。
2. 创建临时表时候,只是在数据库中定义了一个永久的数据字典定义,在插入数据后才在临时表空间中分配临时段。
3. 临时表是静态的,所以可以为临时表创建索引,视图,触发器等对象。
4. 由于临时表的特征,临时表一般不支持常规表的很多特性,例如压缩,外键(无法参考其他表,也无法被其他表参考)等,所以临时表一般只能是单表存在。
会话1:
HR >create global temporary table test(id date) on commit preserve rows;
Table created.
HR >insert into test values(sysdate);
HR >select table_name,TEMPORARY from user_tables where table_name='TEST';
TABLE_NAME |T
------------------------------|-
TEST |Y
HR >select dbms_metadata.get_ddl('TABLE','TEST') from dual;
DBMS_METADATA.GET_DDL('TABLE','TEST')
--------------------------------------------------------------------------------
CREATE GLOBAL TEMPORARY TABLE "HR"."TEST"
( "ID" DATE
) ON COMMIT PRESERVE ROWS
HR >select * from test;
ID
-------------------
2013-06-16 12:36:03
HR >select username,sqladdr,sqlhash,blocks from v$sort_usage;
USERNAME |SQLADDR | SQLHASH| BLOCKS
---------------|----------------|----------|----------
HR |000000006B9FA368|1029988163| 128
新建会话2查看:
HR >select * from test;
no rows selected
退出会话1,在会话2中查看:
HR >select username,sqladdr,sqlhash,blocks from v$sort_usage;
no rows selected
会话1:
HR >truncate table test;
Table truncated.
HR >drop table test;
Table dropped.
建立临时表:
HR > CREATE GLOBAL TEMPORARY TABLE "HR"."TEST"
2 ( "ID" DATE
3 ) ON COMMIT delete ROWS;
临时段已经分配:
HR >select username,sqladdr,sqlhash,blocks from v$sort_usage;
USERNAME |SQLADDR | SQLHASH| BLOCKS
---------------|----------------|----------|----------
HR |000000006B9FA368|1029988163| 128
插入数据
HR >insert into test values(sysdate);
1 row created.
HR >select * from test;
ID
-------------------
2013-06-16 13:27:57
HR >commit;
Commit complete.
HR >select * from test;
no rows selected
1. 多表关联查询,查询表较多,可以把查询结果放在临时表,在会话过程中直接访问临时表即可,这样可以提高查询效率。当然Oracle本身就会对二次查询进行优化,所以这需要很好地理解业务逻辑,从而决定是否需要。
create global temporary table test on commit preserve rows as select a.FIRST_NAME,b.JOB_TITLE from employees a,jobs b where a.job_id=b.job_id;;
2. 强调用户会话操作的独立性。
3. 程序执行过程中可能需要存放一些临时的数据(例如出报表),这些数据在整个程序的会话过程中都需要用到。