临时表空间
建立临时表空间:CREATE TEMPORARY TABLESPACE TEMP01
TEMPFILE '/u01/app/oracle/product/9.2.0/oradata/demo/tempts01.dbf'
SIZE 100M
[UNIFORM SIZE 128k |AUTOALLOCATE];
显示临时表空间包含的文件:
select file_name, bytes, maxbytes, autoextensible
from dba_temp_files
where tablespace_name='TEMP01';
显示临时文件动态信息:
select name, status,enabled from v$tempfile;
临时表
1 临时表用于保存事务或会话期间的中间结果集。
2 临时表的两种类型:
基于会话的临时表:在会话断开之间,或者通过delete或truncate物理地删除行之前,数据一直存在于临时表中
create global temporary table temp_table_session
on commit preserve rows
as
select * from scott.emp where 1=0;
基于事务的临时表:在会话提交事务时,临时表中的行就不见了。
create global temporary table temp_table_transaction
on commit delete rows
as
select * from scott.emp where 1=0;
3 两种类型的临时表都必须手工创建,手工使用,没有任何操作会自动使用临时表。
4 临时表的创建动作不涉及存储空间分配,只有当应用中的会话第一次在临时表中插入数据时才会为该会话的临时表 创建一个临时段(即从该用户所拥有的临时表空间分配存储)。
5 不要在运行时在你的存储过程中创建表。这不是Oracle中使用临时表的正确做法。而应该像永久表一样,作为应用 安装的一部分将所有全局临时表只创建一次。
6 不要试图利用临时表去分解一个联结几个表的"大"查询,不要想着你比优化器更聪明。
7 临时表可以有永久表的许多属性。如触发器,检查约束,索引,但不支持:
引用完整性,NESTED TABLE 类型的列,IOT,CLUSTER,分区,ANALYZE 命令.
临时文件:当执行排序操作时,服务器进程首先会将数据放到PGA区,当PGA区不中以存放临时数据时,服务器进程就会建 立临时段,并将这些临时数据放到临时段中。ORACLE使用临时文件来存储大规模排序操作和散列操作的中间结果。还会用临时文件存储全局临时表数据,或结果集。永久数据对象不会存储在临时文件中,但是临时表及其 索引的内容要存储在临时文件中。
临时文件与redo/undo
临时表不会为它们的块生成redo,对临时表的操作是不可恢复的。不过临时表会生成undo,就像普通表一样。而 undo总受redo的保护,即undo数据就像表数据或索引数据一样,对undo的修改会生成一些redo,而这些redo会记 入日志。因此临时表也会生成一些redo。
关于临时表上的DML活动,有以下结论:
INSERT会生成很少甚至不生成undo/redo
DELERE在临时表上生成的redo与在普通表上生成的redo同样多
临时表的UPDATE会生成普通表UPDATE一半的redo.
存在问题:
在oracle中,临时表一定存在。不手工创建(两种类型的临时表)也存在吗?显然不可能,
默认情况下的临时表是什么类型的。基于事务的