欢迎投稿

今日深度:

Oracle 基于事务的临时表在11g和12C下的区别,ora

Oracle 基于事务的临时表在11g和12C下的区别,oracle事务11g12c


    Oracle 基于事务的临时表在11g和12C下的区别下,可以看到收集临时表的统计信息后,前者记录被清空,后者没有,这是个很重要的区别。在公司环境上用的是12C,在现场用的是11g,使用临时表会造成时快时慢,之前我有帖子http://blog.csdn.net/stevendbaguo/article/details/39964807,用了hint之后,也不是特别好,于是直接采集,结果临时表被清空。解决的方法是:建基于session的临时表,且每次用完之后要truncate,要不然,会有问题。

SQL> select * from v$version;

BANNER                                                                               CON_ID
-------------------------------------------------------------------------------- ----------
Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production              0
PL/SQL Release 12.1.0.1.0 - Production                                                    0
CORE 12.1.0.1.0 Production                                                        0
TNS for Linux: Version 12.1.0.1.0 - Production                                            0
NLSRTL Version 12.1.0.1.0 - Production                                                    0
SQL> drop table test purge;
--基于事务的临时表
SQL> create global temporary table test
    (
      ID   number
    )
    on commit delete rows;
SQL> insert into test select object_id from dba_objects;
99412 rows inserted
SQL> select count(1) from test;
  COUNT(1)
----------
     99412
SQL> exec dbms_stats.gather_table_stats(user,'test');
SQL> select count(1) from test;
  COUNT(1)
----------
     99412
     
     
     
SQL> select * from v$version;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
PL/SQL Release 11.2.0.1.0 - Production
CORE 11.2.0.1.0 Production
TNS for Linux: Version 11.2.0.1.0 - Production
NLSRTL Version 11.2.0.1.0 - Production
SQL> drop table test purge;
--基于事务的临时表
SQL> create global temporary table test
    (
      ID   number
    )
    on commit delete rows;
SQL> insert into test select object_id from dba_objects;
70379 rows inserted
SQL> select count(1) from test;
  COUNT(1)
----------
     70379
SQL> exec dbms_stats.gather_table_stats(user,'test');
SQL> select count(1) from test;
  COUNT(1)
----------
         0

oracle中临时表的问题

临时表的创建

创建Oracle 临时表,可以有两种类型的临时表:

会话级的临时表

事务级的临时表 。

1) 会话级的临时表因为这这个临时表中的数据和你的当前会话有关系,当你当前SESSION 不退出的情况下,临时表中的数据就还存在,而当你退出当前SESSION 的时候,临时表中的数据就全部没有了,当然这个时候你如果以另外一个SESSION 登陆的时候是看不到另外一个SESSION 中插入到临时表中的数据的。即两个不同的SESSION 所插入的数据是互不相干的。当某一个SESSION 退出之后临时表中的数据就被截断(truncate table ,即数据清空)了。会话级的临时表创建方法:

Create Global Temporary Table Table_Name (Col1 Type1,Col2 Type2...) On Commit Preserve Rows ;
举例:

create global temporary table Student (Stu_id Number(5), Class_id Number(5), Stu_Name Varchar2(8), Stu_Memo varchar2(200)) on Commit Preserve Rows ;

step 1
insert into Student values ()
step 2
commit
Student 还有数据

2) 事务级临时表是指该临时表与事务相关,当进行事务提交或者事务回滚的时候,临时表中的数据将自行被截断,其他的内容和会话级的临时表的一致(包括退出SESSION 的时候,事务级的临时表也会被自动截断)。事务级临时表的创建方法:

Create Global Temporary Table Table_Name (Col1 Type1,Col2 Type2...) On Commit Delete Rows ;
举例:

create global temporary table Classes (Class_id Number(5), Class_Name Varchar2(8), Class_Memo varchar2(200)) on Commit delete Rows ; 3) 两中类型临时表的区别

step 1
insert into Student values ()
step 2
commit
Student 中没有数据啦

会话级临时表采用 on commit preserve rows ;而事务级则采用 on commit delete rows ;用法上,会话级别只有当会话结束临时表中的数据才会被截断,而且事务级临时表则不管是 commit 、 rollback 或者是会话结束,临时表中的数据都将被截断

不管那种创建临时表过程都必须先在数据库中创建 , 与SQL server 不同
 

oracle 11g 与 12c 有什不同?

在OOW 2012上Tom kyte介绍了Oracle新一代重量级数据库产品12c 的12个新特性, 目前Open World 2012的主要PDF都可以下载了,传送门在此:Search Content Catalog for Oracle OpenWorld 2012 sessions。
Tom的《12 Things About The Latest Generation of Database Technology》下载地址。

这里我们来领略下Tom眼中的12个特性增强:

#1 Even better PL/SQL from SQL, 直接在SQL中嵌入PL/SQL对象并运行,猜测可能优化了SQL engine 和 PL/SQL engine 2种的代码引擎之间的交互,以获得比之前传统的SQL调用函数更少的上下文切换。

#2 Improved Defaults 增强了DEFAULT, default目前可以直接指代sequence了,同时增强了default充当identity的能力

Default to a sequence
Default when null inserted
Identity Type
Metadata-only Defaults for NULL columns

#3 Increased Size Limit for VARCHAR2, NVARCHAR2, and RAW Data Types
Varchar2, NVarchar2 and Raw这些数据类型的大小上限可以扩展到32k,和其在PL/SQL中的变量类型一样了,当然过长可能导致像LOB那样OUT OF LINE存放

#4 Easy Top-N and pagination queries ,更易用的Top-N和页码查询
提供了类似MySQL中limit的语法,Row Limiting Clause

FETCH FIRST 5 ROWS ONLY; ==》仅fetch前5行
FETCH NEXT 0.01 PERCENT ROWS ONLY; 仅fetch 0.0.1%的行数

#5 Row Pattern Matching 增强的行模式匹配
提供了新的模式匹配子句 match_recognize,可以通过match_recognize 定义正则语法

#6 Partitioning Improvements 分区特性增强 , 包括异步维护全局索引的drop和truncate分区操作, 以及Interval + Reference分区方式
Asynchronous Global Index Maintenance for DROP and TRUNCATE
partition
Cascade Functionality for TRUCATE and EXCHANGE partition
Multiple partition operations in a single DDL
Online move of a partition (without DBMS_REDEFINITION)
Interval + Reference partitioning

#7 Adaptive Execution Plans 自适应执行计划, 该特性可以谈得上神奇,最终的执行计划将基于执行中获得的行,列倾斜造成的问题将被克服

#8 Enhanced Statistics 统计信息增强, 加入了第11级的动态采样, 对于并行查......余下全文>>
 

www.htsjk.Com true http://www.htsjk.com/shujukunews/3913.html NewsArticle Oracle 基于事务的临时表在11g和12C下的区别,oracle事务11g12c Oracle 基于事务的临时表在11g和12C下的区别下,可以看到收集临时表的统计信息后,前者记录被清空,后者没有,这是个很重要...
评论暂时关闭