Oracle 21c中dbms_stats.gather_table_stats的作用及结果查看方法
DBMS_STATS.GATHER_TABLE_STATS 存储过程的作用
这个存储过程是Oracle官方提供的统计信息收集工具,核心作用是:
- 收集指定表、关联列以及索引的优化器统计信息,包括表的总行数、数据块数、列的数据分布情况、索引的选择性等。
- 这些统计信息是Oracle查询优化器生成高效执行计划的核心依据,缺少准确统计信息时,优化器可能选择低效查询路径,导致SQL执行变慢。
为什么查询DBA_TAB_STATISTICS无结果?如何查看执行结果?
问题原因
DBA_TAB_STATISTICS是DBA级别的数据字典视图,需要DBA角色或SELECT ANY DICTIONARY权限才能访问,普通用户(如你的bichvan用户)默认无此权限,因此查询无结果。
正确的查看方式
- 查询当前用户的表统计信息(推荐)
用bichvan用户登录后,直接查询USER_TAB_STATISTICS视图(当前用户专属统计视图,无需额外权限):
SELECT table_name, num_rows, blocks, last_analyzed FROM user_tab_statistics WHERE table_name = 'EMPLOYEES';
结果中last_analyzed字段会显示统计信息的收集时间,num_rows为统计出的表行数,可据此确认存储过程是否执行成功。
- 验证统计生效的额外方式
也可查询USER_TABLES视图确认统计收集时间:
SELECT last_analyzed FROM user_tables WHERE table_name = 'EMPLOYEES';
若返回具体时间戳,说明存储过程已成功收集统计信息。
- 如需查询DBA_TAB_STATISTICS
切换到SYSDBA身份(比如用sqlplus sys/密码 as sysdba登录),执行:
SELECT owner, table_name, num_rows, last_analyzed FROM dba_tab_statistics WHERE owner = 'BICHVAN' AND table_name = 'EMPLOYEES';
或者给bichvan用户授予权限:
GRANT SELECT ANY DICTIONARY TO bichvan;
授予后bichvan用户即可查询DBA_TAB_STATISTICS视图。
注意事项
Oracle默认会将表名转换为大写,若创建表时用双引号指定小写(如CREATE TABLE "employees" (...)),查询视图时需用双引号匹配大小写:WHERE table_name = 'employees';。
内容的提问来源于stack exchange,提问作者Đỗ Như Vỹ
相关产品推荐
相关产品推荐

