create table进阶学习(二)_全局临时表_global temporary table

---全局临时表创建语法
SQL> create global temporary table t_global_temp(a int)
  2  on commit delete rows;
Table created.
---查询表名
SQL> select table_name from user_tables where table_name='T_GLOBAL_TEMP';
TABLE_NAME
------------------------------------------------------------
T_GLOBAL_TEMP
--查询表对应的segment
SQL> select segment_name,segment_type from user_segments where segment_name='T_G
LOBAL_TEMP';
no rows selected
---插入数据
SQL> insert into t_global_temp values(1);
1 row created.
SQL> commit;
Commit complete.
--提交查询无记录
SQL> select * from t_global_temp;
no rows selected
--再次查询segment无记录,原因:创建全局临时表指定on commit delete rows一提交即清表
SQL> select segment_name,segment_type from user_segments where segment_name='T_G
LOBAL_TEMP';
no rows selected

SQL> insert into t_global_temp values(1);
1 row created.
--插入不提交即可查询到记录
SQL> select segment_name,segment_type from user_segments where segment_name='T_G
LOBAL_TEMP';
no rows selected
--提交与否皆不占用存储空间,引申问题:哪全局临时表的数据存储在哪儿呢?
SQL> select segment_name,segment_type from user_segments where segment_name='T_G
LOBAL_TEMP';
no rows selected

---以基于会话方式创建全局临时表
SQL> create global temporary table t_global_temp(a int) on commit preserve rows;

Table created.
SQL> insert into t_global_temp values(1);
1 row created.
---提交前查询
SQL> select * from t_global_temp;
         A
----------
         1
SQL> select segment_name,segment_type from user_segments where segment_name='T_G
LOBAL_TEMP';
no rows selected
SQL> commit;
Commit complete.
--提交后查询
SQL> select * from t_global_temp;
         A
----------
         1
---附上提交前后在另一会话查全局临时表测试,全局临时表的数据仅在当前会话可见
SQL> select * from t_global_temp;
no rows selected
SQL> /
no rows selected
SQL> desc t_global_temp;
 Name                                      Null?    Type
 ----------------------------------------- -------- -----------------------
 A                                                  NUMBER(38)
---测试全局临时表的alter table及create index及alter index
--如全局临时表正在使用alter table不能运行
SQL> alter table t_global_temp add b int;
alter table t_global_temp add b int
*
ERROR at line 1:
ORA-14450: attempt to access a transactional temp table already in use
---只有退出当前会话
SQL> exit
Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64
bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
C:\Users\123>sqlplus scott/system
SQL*Plus: Release 11.2.0.1.0 Production on Wed Jan 9 16:07:10 2013
Copyright (c) 1982, 2010, Oracle.  All rights reserved.

Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
---再次alter table即可成功
SQL> alter table t_global_temp add b int;
Table altered.
---在全局临时表构建索引
SQL> create index idx_temp on t_global_temp(a);
Index created.
--删除全局临时表索引
SQL> drop index idx_temp;
Index dropped.
SQL> select count(*) from t_global_temp;
  COUNT(*)
----------
         0
SQL> insert into t_global_temp select 1,3 from dual connect by level<3e5;
299999 rows created.
SQL> commit;
Commit complete.
---收集全局临时表的统计信息
SQL> exec dbms_stats.gather_table_stats(user,'t_global_temp');
PL/SQL procedure successfully completed.
SQL> select * from table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
-----------------------------------------------------------------------------
Plan hash value: 62698482
----------------------------------------------------------------------------
| Id  | Operation          | Name          | Rows  | Cost (%CPU)| Time     |
----------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |               |     1 |   257   (4)| 00:00:04 |
|   1 |  SORT AGGREGATE    |               |     1 |            |          |
|   2 |   TABLE ACCESS FULL| T_GLOBAL_TEMP |   599K|   257   (4)| 00:00:04 |
----------------------------------------------------------------------------
9 rows selected.
---仅插一条a值888888888888888888888的记录到全局临时表
SQL> insert into t_global_temp select 888888888888888888888,1 from dual;
1 row created.
SQL> commit;
Commit complete.
SQL> explain plan for select count(*) from t_global_temp where a=88888888888888
888888;
Explained.
--执行计划显示走了索引
SQL> select * from table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
-------------------------------------------------------------------------------
Plan hash value: 1743356947
------------------------------------------------------------------------------
| Id  | Operation         | Name     | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |          |     1 |     3 |     3   (0)| 00:00:01 |
|   1 |  SORT AGGREGATE   |          |     1 |     3 |            |          |
|*  2 |   INDEX RANGE SCAN| IDX_TEMP |     1 |     3 |     3   (0)| 00:00:01 |
------------------------------------------------------------------------------
Predicate Information (identified by operation id):
PLAN_TABLE_OUTPUT
-------------------------------------------------------------------------------
---------------------------------------------------
   2 - access("A"=888888888888888888888)
14 rows selected.
----全局临时表的操作限制
----不能分区,不能集簇化,不能iot化
Temporary tables cannot be partitioned, clustered, or index organized.
 
---不能指定外键约束
You cannot specify any foreign key constraints on temporary tables.
 
---不能包含nested table column
Temporary tables cannot contain columns of nested table.
 
----不能指定lob_storage_clause的参数:tablespace,storage_clause or logging_clause
You cannot specify the following clauses of the LOB_storage_clause: TABLESPACE, storage_clause, or logging_clause.
 
---不能启用并行update,delte,merge
Parallel UPDATE, DELETE and MERGE are not supported for temporary tables.
 
---在segment_atrributes_clause子句中,唯一可指定的参数是:tablespace
The only part of the segment_attributes_clause you can specify for a temporary table is TABLESPACE, which allows you to specify a single temporary tablespace.
 
---不支持分布式事务
Distributed transactions are not supported for temporary tables.

小结:全局临时表特别适用于存储中转结果,即临时计算的结果,非最终结果;
     可用于报表统计存储过程.
 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/9240380/viewspace-752388/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/9240380/viewspace-752388/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值