• Oracle 临时事务表 全局临时表_global temporary table


    所有的操作都在一个事务里,事务提交后,此表清空,特别适合做插入删除频率特别高的临时表操作,比如插入完数据就开始查询,查询完就删掉等,用完就扔!

    临时表分事务级临时表和会话级临时表。 
    事务级临时表只对当前事务有效,通过语句:ON COMMIT DELETE ROWS 指定。 
    会话级临时表对当前会话有效,通过语句:ON COMMIT PRESERVE ROWS语句指定。

    -- Create table

    create global temporary table WFM_TMP_WORKLIST

    (

      proc_inst_id NUMBER(10),

      workitem_id  NUMBER(10),

      buzicondi    NVARCHAR2(500)

    )

    on commit delete rows;


    ---全局临时表创建语法
    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:Users123>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.


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


  • 相关阅读:
    headfirst设计模式(6)—单例模式
    headfirst设计模式(5)—工厂模式体系分析及抽象工厂模式
    headfirst设计模式(4)—工厂模式
    headfirst设计模式(3)—装饰者模式
    headfirst设计模式(2)—观察者模式
    headfirst设计模式(1)—策略模式
    BeanFactory 与 FactoryBean
    两个List集合取交集、并集、差集
    服务编排
    oracle报错ORA-01843: not a valid month
  • 原文地址:https://www.cnblogs.com/ae6623/p/4416243.html
Copyright © 2020-2023  润新知