Oracle 基於事務的臨時表在11g和12C下的區別
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