You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle中如何更新表统计信息?删除记录后如何更新NUM_ROWS等统计项?

1. 如何在Oracle数据库中更新表的统计信息?

Oracle提供两种主流方式更新表统计信息,优先推荐使用DBMS_STATS包(Oracle官方认可,支持批量操作、自动采样等高级特性),也可使用传统的ANALYZE命令:

  • 使用DBMS_STATS包收集统计信息
    收集单表及关联索引的统计信息:

    EXEC DBMS_STATS.GATHER_TABLE_STATS(
        OWNNAME => '你的数据库用户名',
        TABNAME => '目标表名',
        ESTIMATE_PERCENT => DBMS_STATS.AUTO_SAMPLE_SIZE, -- 自动选择最优采样率
        CASCADE => TRUE -- 同步收集表关联索引的统计信息
    );
    

    若需收集整个用户下所有表的统计信息,可执行:

    EXEC DBMS_STATS.GATHER_SCHEMA_STATS(OWNNAME => '你的数据库用户名');
    
  • 使用ANALYZE命令收集统计信息
    计算精确统计信息(适合小表,耗时较长):

    ANALYZE TABLE 目标表名 COMPUTE STATISTICS;
    

    基于采样估算统计信息(适合大表,提升效率):

    ANALYZE TABLE 目标表名 ESTIMATE STATISTICS SAMPLE 10 PERCENT; -- 采样10%的数据生成统计
    
2. 在Oracle数据库中删除表中的部分记录后,如何更新NUM_ROWS、LAST_ANALYZED等统计信息?

NUM_ROWS(表实际行数)、LAST_ANALYZED(最后统计时间)属于表统计信息的核心字段,删除记录后重新收集表统计信息即可同步更新这些值,操作逻辑与更新表统计信息一致:

  • 推荐方式:用DBMS_STATS重新收集
    执行单表统计收集命令后,Oracle会自动扫描当前表数据,将NUM_ROWS更新为剩余实际行数,同时把LAST_ANALYZED设置为操作执行时间:

    EXEC DBMS_STATS.GATHER_TABLE_STATS(OWNNAME => '你的用户名', TABNAME => '目标表名');
    
  • 手动指定行数(仅特殊场景使用,不推荐)
    若无需完整统计信息,仅临时修正NUM_ROWS值,可手动设置,但此方法不会更新数据分布、索引统计等其他字段:

    EXEC DBMS_STATS.SET_TABLE_STATS(
        OWNNAME => '你的用户名',
        TABNAME => '目标表名',
        NUMROWS => 实际剩余行数 -- 需自行确认准确数值
    );
    

注意:删除记录后若不更新统计信息,Oracle优化器可能依赖旧数据生成低效执行计划,建议在数据量变动超过10%-20%时及时更新统计信息。

内容的提问来源于stack exchange,提问作者aeiou

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 10:00:24