读书笔记:一文搞懂Oracle全局临时表的统计信息管理

我们的文章会在微信公众号IT民工的龙马人生博客网站( www.htz.pw )同步更新 ,欢迎关注收藏,也欢迎大家转载,但是请在文章开始地方标注文章出处,谢谢!
由于博客中有大量代码,通过页面浏览效果更佳。

本文为个人学习《Expert Oracle Database Architecture Techniques and Solutions for High Performance and Productivity(第四版本》一书过程中的笔记与理解分享,仅用于学习与交流,部分内容参考原书观点并结合>实际经验进行整理。若涉及版权问题,请联系删除或沟通处理。也请大家支持购买原版书籍。

一文搞懂Oracle全局临时表的统计信息管理

临时表是Oracle数据库中非常有用的功能,但你知道如何正确管理它们的统计信息吗?本文将用通俗易懂的方式,带你全面了解全局临时表的统计信息管理技巧。

全局临时表统计信息的基本原理

全局临时表(Global Temporary Table)是Oracle中一种特殊的表,它的数据只在当前会话或事务中有效。由于这种特性,它的统计信息管理也与普通表有所不同:

  1. 默认情况下,临时表的统计信息是会话级的,只在当前会话中有效
  2. 也可以设置共享统计信息,供所有会话使用
  3. 根据临时表的定义方式(ON COMMIT DELETE ROWS或ON COMMIT PRESERVE ROWS),统计信息的收集行为会有所不同

会话级统计信息:为每个会话量身定制

想象你有一个临时表,每个用户使用时填入的数据可能完全不同。这时会话级统计信息就派上用场了:

-- 创建临时表(提交后保留行)
CREATE GLOBAL TEMPORARY TABLE gt(x NUMBER) ON COMMIT PRESERVE ROWS;

-- 插入数据
INSERT INTO gt SELECT user_id FROM all_users;

-- 收集统计信息
EXEC dbms_stats.gather_table_stats(user, 'GT');

查询统计信息时,你会看到两份数据:

  • SHARED:共享统计信息(初始为空)
  • SESSION:当前会话的统计信息

重要特性

  • 这些统计信息只在当前会话有效
  • 断开重连后,会话统计信息就消失了
  • 优化器会优先使用会话统计信息

共享统计信息:多个会话共用

如果所有会话使用临时表的方式相似,可以设置共享统计信息:

-- 设置统计信息偏好为SHARED
EXEC dbms_stats.set_table_prefs(user, 'GT','GLOBAL_TEMP_TABLE_STATS','SHARED');

-- 收集统计信息
EXEC dbms_stats.gather_table_stats(user, 'GT');

共享统计信息会一直保留,直到你手动删除它们:

-- 删除统计信息
EXEC dbms_stats.delete_table_stats(user, 'GT');

两种临时表的统计信息差异

Oracle中的临时表有两种定义方式,它们的统计信息行为也不同:

1. ON COMMIT DELETE ROWS(提交后删除数据)

CREATE GLOBAL TEMPORARY TABLE temp_del(x NUMBER) ON COMMIT DELETE ROWS;

特点

  • 收集统计信息时不会自动提交
  • 可以获取到真实的统计信息(不会因为提交而丢失数据)

2. ON COMMIT PRESERVE ROWS(提交后保留数据)

CREATE GLOBAL TEMPORARY TABLE temp_pres(x NUMBER) ON COMMIT PRESERVE ROWS;

特点

  • 使用CTAS(CREATE TABLE AS SELECT)或直接路径插入时,会自动生成会话统计信息
  • 无需手动收集统计信息

直接路径加载的自动统计信息

对于ON COMMIT PRESERVE ROWS的临时表,使用以下操作时会自动生成统计信息:

  1. CTAS(创建表并插入数据):
CREATE GLOBAL TEMPORARY TABLE gt_pres 
ON COMMIT PRESERVE ROWS
AS SELECT * FROM all_users;
  1. 直接路径INSERT:
INSERT /*+ APPEND */ INTO gt_pres SELECT * FROM all_users;

这样就省去了手动调用DBMS_STATS的步骤,非常方便!

总结:如何选择合适的统计信息方式

  1. 数据差异大的会话 → 使用默认的会话级统计信息
  2. 数据相似的多个会话 → 设置共享统计信息
  3. ON COMMIT DELETE ROWS表 → 可以正常收集统计信息
  4. ON COMMIT PRESERVE ROWS表 → 直接路径操作自动生成统计信息

通过合理利用这些特性,可以让Oracle优化器为临时表生成更准确的执行计划,提升查询性能!

------------------作者介绍-----------------------
姓名:黄廷忠
现就职:Oracle中国高级服务团队
曾就职:OceanBase、云和恩墨、东方龙马等
电话、微信、QQ:18081072613
个人博客: (http://www.htz.pw)
CSDN地址: (https://blog.csdn.net/wwwhtzpw)
博客园地址: (https://www.cnblogs.com/www-htz-pw)

posted @ 2025-09-08 21:07  认真就输  阅读(17)  评论(0)    收藏  举报