Oracle统计信息管理:DBMS_STATS包实战技巧

一、统计信息核心概念

1.1 统计信息的作用与组成

Oracle优化器依赖统计信息来生成高效的执行计划。统计信息主要包括:

  • 表统计信息:行数、块数、行平均长度等
  • 列统计信息:不同值数量(NDV)、空值数量、数据分布等
  • 索引统计信息:索引层级、叶块数、聚簇因子等
  • 系统统计信息:CPU速度、I/O性能等

1.2 统计信息收集方法对比

收集方法 优点 缺点 适用场景
自动收集 自动化,减少人工干预 可能不满足特殊需求 标准OLTP环境
手动收集 可定制参数,更精确 需要管理维护 数据仓库/复杂系统
增量收集 只收集变化部分,速度快 需要额外设置 大型分区表
在线收集 不影响业务运行 可能略慢 生产环境关键表

二、DBMS_STATS基础操作

2.1 收集表统计信息

-- 基本表统计收集
BEGIN
  DBMS_STATS.GATHER_TABLE_STATS(
    ownname          => 'HR',
    tabname          => 'EMPLOYEES',
    estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE,
    method_opt       => 'FOR ALL COLUMNS SIZE AUTO',
    degree           => 4,
    cascade          => TRUE
  );
END;
/

-- 带特定参数的收集
BEGIN
  DBMS_STATS.GATHER_TABLE_STATS(
    ownname          => 'SH',
    tabname          => 'SALES',
    estimate_percent => 10,  -- 10%采样
    block_sample     => TRUE, -- 使用块采样
    method_opt       => 'FOR COLUMNS SIZE 1 CUST_ID, FOR ALL COLUMNS SIZE AUTO',
    granularity      => 'ALL', -- 包括子分区
    cascade          => TRUE,
    no_invalidate    => FALSE -- 立即失效相关游标
  );
END;
/

2.2 收集模式统计信息

-- 收集整个模式统计信息
BEGIN
  DBMS_STATS.GATHER_SCHEMA_STATS(
    ownname          => 'HR',
    estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE,
    method_opt       => 'FOR ALL COLUMNS SIZE AUTO',
    degree           => 8,
    options         => 'GATHER AUTO',
    cascade         => TRUE
  );
END;
/

-- 只收集过期的统计信息
BEGIN
  DBMS_STATS.GATHER_SCHEMA_STATS(
    ownname          => 'SH',
    options         => 'GATHER STALE',
    cascade         => TRUE
  );
END;
/

三、高级统计信息管理

3.1 增量统计信息收集

-- 启用表的增量统计
BEGIN
  DBMS_STATS.SET_TABLE_PREFS(
    ownname => 'SH',
    tabname => 'SALES',
    pname   => 'INCREMENTAL',
    pvalue  => 'TRUE'
  );
  
  DBMS_STATS.SET_TABLE_PREFS(
    ownname => 'SH',
    tabname => 'SALES',
    pname   => 'INCREMENTAL_STALENESS',
    pvalue  => 'USE_STALE_PERCENT, 5'
  );
END;
/

-- 执行增量收集
BEGIN
  DBMS_STATS.GATHER_TABLE_STATS(
    ownname => 'SH',
    tabname => 'SALES',
    granularity => 'AUTO',
    incremental => TRUE
  );
END;
/

3.2 系统统计信息管理

-- 收集系统统计信息(需要SYSDBA权限)
BEGIN
  DBMS_STATS.GATHER_SYSTEM_STATS(
    gathering_mode => 'NOWORKLOAD',
    interval      => 60
  );
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦幻南瓜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值