我们的文章会在微信公众号IT民工的龙马人生和博客网站( www.htz.pw )同步更新 ,欢迎关注收藏,也欢迎大家转载,但是请在文章开始地方标注文章出处,谢谢!
由于博客中有大量代码,通过页面浏览效果更佳。
本文为个人学习《Expert Oracle Database Architecture Techniques and Solutions for High Performance and Productivity(第四版本》一书过程中的笔记与理解分享,仅用于学习与交流,部分内容参考原书观点并结合>实际经验进行整理。若涉及版权问题,请联系删除或沟通处理。也请大家支持购买原版书籍。
一文搞懂Oracle全局临时表的统计信息管理
临时表是Oracle数据库中非常有用的功能,但你知道如何正确管理它们的统计信息吗?本文将用通俗易懂的方式,带你全面了解全局临时表的统计信息管理技巧。
全局临时表统计信息的基本原理
全局临时表(Global Temporary Table)是Oracle中一种特殊的表,它的数据只在当前会话或事务中有效。由于这种特性,它的统计信息管理也与普通表有所不同:
- 默认情况下,临时表的统计信息是会话级的,只在当前会话中有效
- 也可以设置共享统计信息,供所有会话使用
- 根据临时表的定义方式(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的临时表,使用以下操作时会自动生成统计信息:
- CTAS(创建表并插入数据):
CREATE GLOBAL TEMPORARY TABLE gt_pres
ON COMMIT PRESERVE ROWS
AS SELECT * FROM all_users;
- 直接路径INSERT:
INSERT /*+ APPEND */ INTO gt_pres SELECT * FROM all_users;
这样就省去了手动调用DBMS_STATS的步骤,非常方便!
总结:如何选择合适的统计信息方式
- 数据差异大的会话 → 使用默认的会话级统计信息
- 数据相似的多个会话 → 设置共享统计信息
- ON COMMIT DELETE ROWS表 → 可以正常收集统计信息
- 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)