千家信息网

数据库中如何实现全局临时表GTT的统计信息

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,这篇文章主要介绍数据库中如何实现全局临时表GTT的统计信息,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!我们都知道,全局临时表GTT分为两种,一种是transaction le
千家信息网最后更新 2026年11月02日数据库中如何实现全局临时表GTT的统计信息

这篇文章主要介绍数据库中如何实现全局临时表GTT的统计信息,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

我们都知道,全局临时表GTT分为两种,一种是transaction level,一种是session level,

分别通过on commit delete rows/preserve rows实现,其中session level表示在本sessoin
数据有效,相同session内,之前事务操作的数据,对于后续的操作都可见,而事务级的GTT表示
一旦事务结束(commit)那么立即delete,相同session 的后续操作看不到之前事务操作。
在9i阶段可以使用GATHER_TABLE_STATS调用来收集统计信息须传入参数GATHER_TEMP为TRUE,
10g开始oracle对于普通表和GTT收集统计信息并没有特殊处理,都是通过GATHER_TABLE_STATS
存储过程来收集,但是由于上述的两种GTT特殊性,收集统计信息有特殊性:

1.对于session level的,因为GTT数据并不持久化,存在session 隔离性,需要在当前session 收集,
若是通过另起窗口(新session)收集统计信息会不成功,原因就是收集统计信息的session 没有数据,
自然也收集不到统计信息了。

2.对于transaction level的,即便是当前session 收集,因为GATHER_TABLE_STATS会先执行默认提交,
所以数据就自动删除,自然也就没有数据可收集了。所以针对这种情景,oracle 有官方note 403587.1介绍
下面就是移花接木办法来收集事务级GTT的步骤
1. create a PRESERVE ROWS table
SQL> create global temporary table TT(I number) on commit preserve rows;
2. populate with representative data
SQL> insert into TT select rownum from dba_objects where rownum<1000;
3. gather stats
SQL> exec dbms_stats.gather_table_stats(null,'TT');
4. create a STAT table
SQL> exec dbms_stats.create_stat_table(null,'TTSTATS');
5. export the stats from the PRESERVE ROWS table
SQL> exec dbms_stats.export_table_stats(null,'TT',null,'TTSTATS',null,true);
6. truncate then drop the PRESERVE ROWS table
SQL> truncate table TT;
SQL> drop table TT;
7. now create the real temporary table (defined using DELETE ROWS - the default)
SQL> create global temporary table TT(I number);
8. finally import the stats exported from the STAT table
SQL> exec dbms_stats.import_table_stats(null,'TT',null,'TTSTATS',null,true);

3.在12c版本,oracle已经进步改善了对这种transaction level GTT的统计信息收集,
也就是说GATHER_TABLE_STATS收集统计信息的时候不会默认发起commit,这样就不会
破坏当前session的事务完整性,收集统计信息的存储过程就可以看到当前session的
数据情况并收集统计信息。
下面是一个简单的测试过程:
3.1.创建transaction level GTT
Create Global Temporary Table maob_temp (a number,b varchar2(100)) On Commit delete Rows; <Table created.

3.2.插入数据
insert into maob_temp select rownum,object_name from dba_objects where rownum<1000;
SQL>

999 rows created.

3.3.收集统计信息
exec dbms_stats.gather_table_stats(user,'MAOB_TEMP');
SQL>
PL/SQL procedure successfully completed.

3.4.check是否数据已经被删除
select count(*)from maob_temp;
SQL>
COUNT(*)
----------
999

3.5.查看统计信息是否已经收集成功
SQL> select TABLE_NAME,NUM_ROWS,BLOCKS,SCOPE from DBA_TAB_STATISTICS where owner='MAOB' AND TABLE_NAME='MAOB_TEMP';

TABLE_NAME NUM_ROWS BLOCKS SCOPE
--------------------------------------
MAOB_TEMP 0 0 SHARED
MAOB_TEMP 999 4 SESSION <<<<

注意:这一步要在和上述步骤相同的session执行,因为12c的这个新功能默认对GTT收集统计信息是session scope的,也就是说统计信息也是
session 隔离的,其他session 看不到这个session收集的统计信息,若是变成传统的shared scope,那么仍然会默认先commit再收集
统计信息并记录数据字典表,供其他session 使用,对于transaction level仍然存在先commit在收集情况,那么要解决问题,仍需要参考步骤
2的移花接木办法,但是创建表之后要先指定为shared scope再收集统计信息。
EXEC DBMS_STATS.SET_TABLE_PREFS (NULL,'TT','GLOBAL_TEMP_TABLE_STATS','SHARED');

以上是"数据库中如何实现全局临时表GTT的统计信息"这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注行业资讯频道!

信息 统计 数据 事务 全局 特殊 相同 步骤 过程 数据库 成功 移花接木 也就是 也就是说 内容 办法 就是 情况 特殊性 篇文章 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 小米移动互联网科技园 互联网和科技创新 河南真二互联网科技有限公司 互联网科技金融 科技服务与互联网 互联网科技公司发展 凡科互联网科技 科技互联网公司logo 互联网养老 桔豆科技 成都仁贤领冠互联网科技有限公司 华脉科技工业互联网产品 江苏南京365互联网科技 996高科技互联网公司 长沙茂晟互联网科技有限公司 科技互联网海报 合肥互联网科技公司公章图片 云南省自由互联网科技有限公司 互联网科技包装股份有限公司上市 容联科技互联网电商 北京瑞云互联网科技有限公司 广州淘业互联网络科技 易通互联网络科技有限公司 科技互联网公司logo 阿里巴巴算科技企业还是互联网 欧洲十大科技互联网公司 互联网与医疗科技 本届互联网博览会上的黑科技 四川慕妮娅互联网科技有限公司 好易买互联网科技 上海互联网科技园景观
0