表统计信息收集情况检查
在 Oracle 数据库中,优化器依赖统计信息生成执行计划。定期检查统计信息的时效性至关重要,否则可能导致全表扫描或错误的索引选择。
我们可以通过查询 DBA_TAB_STATISTICS 视图来查看表的统计信息状态。重点关注 stale_stats 字段,如果显示为 YES,说明统计信息已过期。
set lines 300 pagesize 100
select owner, table_name, last_analyzed, stale_stats
from dba_tab_statistics
where stale_stats = 'YES'
order by last_analyzed;
这个查询能帮你快速定位哪些表的统计信息需要更新。注意,分区表可能需要单独检查每个分区的状态。
自动收集任务状态
默认情况下,Oracle 会启用自动维护窗口任务,在数据库空闲时自动收集统计信息。但有时这些任务可能被禁用或配置不当。
我们可以检查自动任务客户端的状态:
SELECT client_name, status, job_action FROM dba_autotask_client WHERE client_name LIKE '%STAT%';
如果状态不是 ENABLED,或者任务没有按计划运行,就需要手动干预。
调整建议
如果发现统计信息长期未更新,可以检查维护窗口时间或手动触发收集。使用 DBMS_STATS.GATHER_SCHEMA_STATS 进行手动收集通常比较稳妥。
BEGIN
DBMS_STATS.GATHER_SCHEMA_STATS(
ownname => 'YOUR_SCHEMA',
estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE,
method_opt => 'FOR ALL COLUMNS SIZE AUTO'
);
END;
/
实际运行时要注意几点:生产环境建议在业务低峰期操作;对于大表,可以考虑并行度设置;收集前最好备份当前统计信息以防万一。保持统计信息的准确性是性能调优的基础工作之一。

