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

分类:编程技术 时间:2024-02-20 15:57 浏览:0 评论:0
0
本文主要介绍如何实现数据库中全局临时表GTT的统计信息。文章中的介绍非常详细,有一定的参考价值。感兴趣的朋友一定要读一下!

我们都知道全局临时表GTT分为两种,一种是事务级的,一种是会话级的。

它们分别通过提交时删除行/保留行来实现。会话级别表示本次会话中的数据有效。在同一个会话内,之前事务操作的数据将对后续操作可见,而事务级别GTT意味着一旦事务结束(提交),它将立即被删除。 ,同一会话中的后续操作无法看到之前的事务操作。
在9i阶段,可以使用GATHER_TABLE_STATS调用来收集统计信息。参数 GATHER_TEMP 必须作为 TRUE 传递。
开始从10g开始,Oracle没有对普通表和GTT收集统计信息进行特殊处理。所有统计信息都是通过GATHER_TABLE_STATS
存储程序来收集的,但是由于以上两个GTT的特殊性,收集统计信息有其特殊性:

1.对于会话级别,由于GTT数据不是持久化的,因此存在会话隔离。需要在当前会话中采集。
如果通过新窗口(新会话)采集统计信息,是不会成功的。原因是收集统计信息的会话没有数据,
自然收集不到统计信息。

2.对于事务级别,即使是在当前会话中采集,由于GATHER_TABLE_STATS会先执行默认提交,
所以数据会被自动删除,自然就没有数据采集了。所以对于这种场景,Oracle有官方说明403587.1来介绍一下
以下是收集交易级GTT的步骤
1.创建 PRESERVE ROWS 表
SQL> 在提交时创建全局临时表 TT(I 号)保留行;
2.使用代表性数据填充
SQL> insert into TT select rownum from dba_objectswhere rownum<1000;
3.收集统计信息
SQL> exec dbms_stats.gather_table_stats(null,'TT');
4.创建 STAT 表
SQL> exec dbms_stats。 create_stat_table(null,'TTSTATS');
5.从 PRESERVE ROWS 表中导出统计信息
SQL> exec dbms_stats.export_table_stats(null,'TT',null,'TTSTATS',null,true) ;
6.截断然后删除 PRESERVE ROWS 表
SQL> 截断表 TT;
SQL> 删除表 TT;
7.现在创建真正的临时表(使用 DELETE ROWS 定义 - 默认)
SQL> 创建全局临时表 TT(I 编号);
8.最后导入从STAT表导出的统计信息
SQL> exec dbms_stats.import_table_stats(null,' TT',null,'TTSTATS',null,true);

3.在12c版本中,Oracle进一步完善了这个事务级别GTT的统计信息收集,也就是说GATHER_TABLE_STATS在收集统计信息时默认不会发起commit,以免破坏当前事务的完整性会议。收集统计信息的存储过程可以看到当前会话的数据并进行统计。信息。
以下是一个简单的测试流程:
3.1.创建事务级别 GTT
创建全局临时表 maob_temp (a number,b varchar2(100)) On Commit 删除行; <<删除行
已创建表。

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

创建了999行。

3.3.收集统计信息
exec dbms_stats .gather_table_stats(user,'MAOB_TEMP');
SQL>
PL/SQL过程成功完成。

3.4.检查数据是否已到过已删除
select count(* )from maob_temp;
SQL>
COUNT(*)
----------
999

3.5。检查统计信息是否已成功收集
SQL> select TABLE_NAME,NUM_ROWS,BLOCKS,SCOPE from DBA_TAB_STATISTICS whereowner='MAOB' AND TABLE_NAME='MAOB_TEMP';

TABLE_NAME NUM_ROWS BLOCKS SCOPE
>- ----------------------------------
MAOB_TEMP 0 0 共享
MAOB_TEMP 999 4 SESSION<<<<

注意:这一步必须和上一步在同一个会话中执行,因为12c的这个新功能默认为GTT收集统计信息的会话范围,即意味着统计信息也是会话隔离的。其他会话无法看到该会话收集的统计信息。如果变成传统的共享作用域,仍然会默认先提交,然后收集统计数据,并为其他会话记录数据字典表。对于交易层面来说,还存在一个情况先提交然后收集。解决问题仍然需要参考步骤2中嫁接的方法。不过建表后必须先将其指定为共享范围,然后再进行统计。
EXEC DBMS_STATS.SET_TABLE_PREFS(NULL,'TT','GLOBAL_TEMP_TABLE_STATS','SHARED');

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

1. 本站所有资源来源于用户上传或网络,仅作为参考研究使用,如有侵权请邮件联系站长!
2. 本站积分货币获取途径以及用途的解读,想在本站混的好,请务必认真阅读!
3. 本站强烈打击盗版/破解等有损他人权益和违法作为,请各位会员支持正版!
4. 编程技术 > 如何实现数据库中全局临时表GTT的统计信息

用户评论