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

Oracle DBMS_STATS.GATHER_DATABASE_STATS 默认行为

Oracle DBMS_STATS.GATHER_DATABASE_STATS 默认行为

DBMS_STATS.GATHER_DATABASE_STATS的默认选项究竟是’GATHER’还是’GATHER AUTO’?这个问题非常重要,因为理解默认行为直接影响统计信息收集策略。

一 官方文档确认

根据Oracle 19c官方文档:

  • options参数默认值是’GATHER’,不是’GATHER AUTO’
DBMS_STATS.GATHER_DATABASE_STATS (estimate_percent NUMBER   DEFAULT to_estimate_percent_type (get_param('ESTIMATE_PERCENT')),block_sample     BOOLEAN  DEFAULT FALSE,method_opt       VARCHAR2 DEFAULT get_param('METHOD_OPT'),degree           NUMBER   DEFAULT to_degree_type(get_param('DEGREE')),granularity      VARCHAR2 DEFAULT GET_PARAM('GRANULARITY'), cascade          BOOLEAN  DEFAULT to_cascade_type(get_param('CASCADE')),stattab          VARCHAR2 DEFAULT NULL, statid           VARCHAR2 DEFAULT NULL,options          VARCHAR2 DEFAULT 'GATHER',objlist          OUT      ObjectTab,statown          VARCHAR2 DEFAULT NULL,gather_sys       BOOLEAN  DEFAULT TRUE,no_invalidate    BOOLEAN  DEFAULT to_no_invalidate_type (get_param('NO_INVALIDATE')),obj_filter_list ObjectTab DEFAULT NULL);DBMS_STATS.GATHER_DATABASE_STATS (estimate_percent NUMBER   DEFAULT to_estimate_percent_type (get_param('ESTIMATE_PERCENT')), block_sample     BOOLEAN  DEFAULT FALSE,method_opt       VARCHAR2 DEFAULT get_param('METHOD_OPT'),degree           NUMBER   DEFAULT to_degree_type(get_param('DEGREE')),granularity      VARCHAR2 DEFAULT GET_PARAM('GRANULARITY'), cascade          BOOLEAN  DEFAULT to_cascade_type(get_param('CASCADE')),stattab          VARCHAR2 DEFAULT NULL, statid           VARCHAR2 DEFAULT NULL,options          VARCHAR2 DEFAULT 'GATHER',statown          VARCHAR2 DEFAULT NULL,gather_sys       BOOLEAN  DEFAULT TRUE,no_invalidate    BOOLEAN  DEFAULT to_no_invalidate_type (get_param('NO_INVALIDATE')),obj_filter_list ObjectTab DEFAULT NULL);

在这里插入图片描述

二 默认GATHER行为的完整解释

1. 实际默认行为

-- 完全等价的两种写法
DBMS_STATS.GATHER_DATABASE_STATS;
DBMS_STATS.GATHER_DATABASE_STATS(options => 'GATHER');

2. GATHER模式的特点

  • 全量收集:会收集数据库中所有对象的统计信息
  • 不考虑数据变化量:不检查STALE_STATS状态
  • 完全刷新:确保所有统计信息都是最新的

3. 与GATHER AUTO的核心区别

特性GATHER(默认)GATHER AUTO
收集范围所有对象仅需要更新的对象
系统影响
执行时间
统计信息时效性全部最新可能存在延迟
适用场景初始环境/重大变更后日常维护

三、生产环境推荐用法

1. 常规维护建议使用GATHER AUTO

-- 显式指定GATHER AUTO是更好的实践
BEGINDBMS_STATS.GATHER_DATABASE_STATS(options => 'GATHER AUTO',gather_sys => FALSE,degree => DBMS_STATS.AUTO_DEGREE);
END;
/

2. 需要完全刷新时使用默认GATHER

-- 数据仓库全量加载后等场景
BEGINDBMS_STATS.GATHER_DATABASE_STATS(estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE,method_opt => 'FOR ALL COLUMNS SIZE AUTO',degree => 8);  -- 根据系统资源指定并行度
END;
/

四、如何验证当前行为

1. 检查实际收集情况

-- 收集前记录时间戳
ALTER SESSION SET nls_date_format = 'YYYY-MM-DD HH24:MI:SS';
SELECT sysdate FROM dual;-- 执行收集(使用默认参数)
EXEC DBMS_STATS.GATHER_DATABASE_STATS;-- 检查哪些表被更新
SELECT owner, table_name, last_analyzed 
FROM dba_tables
WHERE last_analyzed > TO_DATE('2023-08-01 10:00:00', 'YYYY-MM-DD HH24:MI:SS')
ORDER BY last_analyzed DESC;

2. 查看默认参数设置

-- 检查options默认值
SELECT dbms_stats.get_prefs('OPTIONS') FROM dual;-- 检查全局偏好设置
SELECT * FROM sys.optstat_hist_control$;

五、历史版本差异说明

虽然当前文档明确默认是GATHER,但需要注意:

  1. Oracle 10g/11g时期

    • 存在一些版本/补丁的默认行为可能不同
    • 某些文档曾提到过更智能的默认行为
  2. Oracle 12c及以后

    • 明确规范了默认就是GATHER
    • 但自动维护任务(自动统计信息收集)使用的是GATHER AUTO逻辑

六、最佳实践总结

  1. 不要依赖默认值

    • 显式指定options参数
    • 确保脚本行为明确可控
  2. 两种模式的典型场景

    • GATHER AUTO:日常夜间维护作业
    • GATHER:月维护窗口/数据迁移后
  3. 特殊对象处理

    -- 对大表设置单独策略
    EXEC DBMS_STATS.SET_TABLE_PREFS('SH', 'SALES', 'ESTIMATE_PERCENT', '5');-- 对关键业务表提高收集频率
    EXEC DBMS_STATS.SET_TABLE_PREFS('HR', 'EMPLOYEES', 'STALE_PERCENT', '1');
    
  4. 监控策略

    -- 创建统计信息收集报告
    SELECT job_name, status, actual_start_date, run_duration
    FROM dba_scheduler_job_run_details
    WHERE job_name LIKE 'GATHER_STATS%'
    ORDER BY actual_start_date DESC;
    

DBMS_STATS.GATHER_DATABASE_STATS的默认options参数是’GATHER’,会收集所有对象的统计信息,而不是智能选择。生产环境中显式指定GATHER AUTO通常是更好的选择。

官方文档路径:

https://docs.oracle.com/en/database/oracle/oracle-database/19/arpls/DBMS_STATS.html#GUID-7D7442B5-B060-40E9-AA18-2085E527C3B1
http://www.lryc.cn/news/2379518.html

相关文章:

  • C++天空之城的树 全国信息素养大赛复赛决赛 C++小学/初中组 算法创意实践挑战赛 内部集训模拟题详细解析
  • HTTP 请求走私(HTTP Request Smuggling)
  • 基于WebRTC的实时语音对话系统:从语音识别到AI回复
  • typeof运算符和深拷贝
  • .Net HttpClient 使用 Cookie
  • Python爬虫实战:通过PyExecJS库实现逆向解密
  • Java中的伪共享(False Sharing):隐藏的性能杀手与高并发优化实战
  • GO语言语法---switch语句
  • 开疆智能Profient转ModbusTCP网关连接ABB机器人MODBUS TCP通讯案例
  • 解决qt.network.ssl: QSslSocket::connectToHostEncrypted: TLS initialization failed
  • 【洛谷P3386】二分图最大匹配之Kuhn算法/匈牙利算法:直观理解
  • Text2SQL:自助式数据报表开发---0517
  • 使用Visual Studio将C#程序发布为.exe文件
  • 写spark程序数据计算( 数据库的计算,求和,汇总之类的)连接mysql数据库,写入计算结果
  • React Flow 边的基础知识与示例:从基本属性到代码实例详解
  • oracle 资源管理器的使用
  • 新手入门系列-linux系统下安装和使用docker
  • mysql中4种扫描方式和聚簇索引非聚簇索引【爽文一篇】
  • 贝叶斯优化Transformer融合支持向量机多变量回归预测,附相关性气泡图、散点密度图,Matlab实现
  • 水平可见直线--上凸包(andrew算法
  • 【mysql】并发 Insert 的死锁问题 第二弹
  • Docker配置SRS服务器 ,ffmpeg使用rtmp协议推流+vlc拉流
  • 一个stm32工程从底层上都需要由哪些文件构成
  • [Mac] 开发环境部署工具ServBay 1.12.2
  • 商城小程序源码介绍
  • 鸿蒙OSUniApp 实现图片上传与压缩功能#三方框架 #Uniapp
  • 科技项目验收测试对软件产品和企业分别有哪些好处?
  • javascript和vue的不同
  • duxapp 2025-01-06更新 CLI新增帮助支持,优化基础模块结构
  • 汽车零部件冲压车间MES一体机解决方案