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
相关产品推荐
相关产品推荐

