当前位置: 首页 > news >正文

读书笔记:一文搞懂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)

http://www.agseo.cn/news/387/

相关文章:

  • Anthropic 封禁中国资本背景企业使用Claude!国内AI编程选择将何去何从?
  • 故障处理:dul直接抽取exp文件
  • 解题报告-洛谷P3773 [CTSC2017] 吉夫特
  • ARC137E
  • 政治笔记
  • 并发编程中的乐观锁与悲观锁
  • 软件工程第一次作业(aili)
  • 软考高级“系统架构设计师”论文——论微服务架构及其应用
  • 2025-09-08 uniapp小程序赋值生效了但是页面却没变化?==》使用v-if+变量来控制元素的重新渲染
  • 真题补题笔记
  • 12.8 类与对象的绑定方法和非绑定方法
  • Graspnet视觉抓取(一)——环境搭建
  • 3. 堆排序
  • 12.7 类的property/setter/delter特性
  • 9.8
  • 总结
  • 82python解析器反查当前安装了那些依赖包
  • 【Azure Container App】查看当前 Container App Environment 中的 CPU 使用情况的API
  • nfs服务
  • 低功耗蓝牙BLE与小程序通讯
  • 同事突然关心有没有对象?这可能是职场发展的隐形陷阱
  • TTS微软Azure
  • 12.6 类的封装
  • 深度解码你自己看着办:职场新人必须掌握的潜台词破解术
  • 6 个替代 Jira 的开源项目管理工具推荐
  • 记录一个Windows上的键盘鼠标模拟库和沟子库--Input
  • 惊世骇俗:《易经》六十四卦与数学公理完整映射表
  • 解决docker: Error response from daemon: Get “https://registry-1.docker.io/v2/“:连接超时问题
  • 27届春招备战一轮复习--第三期(推荐)
  • 数据集和数据系统_AI成为工作中很好用的协同成员了