DBMS_STATS收集统计信息的问题及解决

收集数据库的统计信息是dba工作的一部分,如果在数据快速增长的库上,统计信息如果收集的频率太慢,会对执行计划有一定的影响。
而对于逐渐客户饱和的系统来说,统计信息就可以很长时间收集或者尽量不收集。
对于统计信息的收集,如果是很大的表,收集100%也是不现实的,如果收集的百分比太小,统计信息又失真,对系统系统无疑是雪上加霜。
以上是我采用的方式,不一定对,可以参考。如果表的大小超过30G,算是很大的表了,统计信息的收集比例在30%到40%之间,我给了40%。以下类似。
巨型表(>30G),                     percentage 40%.
大型表(>8G,
中型表(>1G,
小 表(

对于较大的表,都加了degree.
exec DBMS_STATS.GATHER_TABLE_STATS(OWNNAME=> 'xxxxx', TABNAME => 'xxxxxx'  ,CASCADE => TRUE, METHOD_OPT =>'FOR ALL INDEXED COLUMNS SIZE 1', ESTIMATE_PERCENT =>60   ,DEGREE=>2,GRANULARITY =>'ALL');

今天我照例准备了一下脚本,自己先试一下有没有问题。结果出乎意料报错了。
SQL> exec DBMS_STATS.GATHER_TABLE_STATS(OWNNAME=> 'XXXX', TABNAME => 'XXXXX'                ,CASCADE => TRUE, METHOD_OPT =>'FOR ALL INDEXED COLUMNS SIZE 1', ESTIMATE_PERCENT =>70   ,DEGREE=>2,GRANULARITY =>'ALL');
BEGIN DBMS_STATS.GATHER_TABLE_STATS(OWNNAME=> 'XXXX', TABNAME => 'XXXXX'                ,CASCADE => TRUE, METHOD_OPT =>'FOR ALL INDEXED COLUMNS SIZE 1', ESTIMATE_PERCENT =>70   ,DEGREE=>2,GRANULARITY =>'ALL'); END;

*
ERROR at line 1:
ORA-20000: Unable to analyze TABLE "XXXX"."XXXXX",
insufficient privileges or does not exist
ORA-06512: at "SYS.DBMS_STATS", line 23143
ORA-06512: at "SYS.DBMS_STATS", line 23205
ORA-06512: at line 1

我试着用dba用户来执行,结果还是同样的错误。我怀疑是不是bug了,
结果在metalink上转了一圈,有过类似的bug,但在11.2版本都修复了。
最后有一篇文章。Doc ID 1315184.1

CAUSE

Analyze operations against the XDB schema require the 'analyze any dictionary' privilege.

SOLUTION

Grant the required privilege:

SQL> grant analyze any dictionary to adamb;

果然好使。

时间: 2024-11-01 13:16:12

DBMS_STATS收集统计信息的问题及解决的相关文章

Oracle 判断 并 手动收集 统计信息 脚本

CREATE OR REPLACE PROCEDURE SchameB.PRC_GATHER_STATS AUTHID CURRENT_USER IS BEGIN SYS.DBMS_STATS.GATHER_TABLE_STATS('SchName', 'TableName', CASCADE => TRUE); END; /   select owner,table_name,last_analyzed,num_rows from dba_tables where owner='SYSTEM'

oracle收集统计信息

什么是统计信息 统计信息主要是描述数据库中表,索引的大小,规模,数据分布状况等的一类信息.比如,表的行数,块数,平均每行的大小,索引的leaf blocks,索引字段的行数,不同值的大小等,都属于统计信息.CBO正是根据这些统计信息数据,计算出不同访问路径下,不同join 方式下,各种计划的成本,最后选择出成本最小的计划. 统计信息是存放在数据字段表中的,如dba_tab_statistics 如何搜集统计信息 统计信息搜集也是有多种方法,推荐大家使用DBMS_STATS 表来进行统计信息搜集及

收集统计信息导致索引被监控

      对于索引的调整,我们可以通过Oracle提供的索引监控特性来跟踪索引是否被使用.尽管该特性并未提供索引使用的频度,但仍不失为我们参考的方式之一.然而,最近在Oracle 10.2.0.3中发现收集统计信息时导致索引也被监控,而不是用于sql查询引发的索引监控.如此这般,索引监控岂不是鸡肋?   1.基于Oracle 10g 收集统计信息索引被监控情形 scott@CNMMBO> select * from v$version where rownum<2; BANNER -----

Oracle收集统计信息之NO_INVALIDATE参数

Oracle收集统计信息之NO_INVALIDATE参数 Oracle统计量对于CBO执行是至关重要的.RBO是建立在数据结构的基础上的,DDL结构.约束会将SQL语句分为不同的成本结构等级.而CBO是在数据结构的基础上,加入数据表细粒度信息,将成本结构细化为成本cost值. 相对于数据表的DDL结构,统计量反映了当下数据表数据分布情况,可变性更强.我们经常遇到这样的场景,数据导入操作之后,原有一个运行良好的作业突然效率低下.当我们手工收集一下统计量之后,作业效率提升.这种现象也就是反映了统计量

收集统计信息的SQL脚本(sosi.sql)--崔华大师

收集统计信息的SQL脚本(sosi.sql)--崔华大师 点击(此处)折叠或打开 set echo off set scan on set lines 150 set pages 66 set verify off set feedback off set termout off column uservar new_value Table_Owner noprint select user uservar from dual; set termout on column TABLE_NAME

Oracle并发(CONCURREMT)收集统计信息 (文档 ID 1555451.1)

 Oracle并发(CONCURREMT)收集统计信息 (文档 ID 1555451.1)   >                    >    >  >      >  >      >                          >   >>             >>>>>> >>>>>> >> > >>>>>&

oracle 11g 收集统计信息的新特点介绍

对组合列创建统计信息 --检查表结构 select * from scott.emp where 1=2; --创建虚拟列 会输出虚拟列名 select dbms_stats.create_extended_stats('scott','emp','(empno,JOB)') from dual; select * from dba_tab_cols where column_name like 'SYS_STU%'; --查看列名 select * from dba_tab_cols a wh

两种方式来收集统计信息

一.手动1.利用analyze语句 analyze   table   table_name   estimate   statistics   sample  *  percent; analyze   table   table_name   compute   statistics   ;前者抽取*所代表的百分比来估算统计数据,而后者则是抽取整个表的信息,无疑后者比较精确,但是速度慢些 2.使用dbms_stats进行收集按照7楼calvin兄的建议,应该优先考虑使用dbms_stats.

oracle数据泵导入分区表统计信息报错(四)问题的解决过程

看来通过检查数据字典信息是找不到什么问题的原因了,只有通过手工执行收集统计信息的过程来尝试发现问题. 为了避免bug意外被解决所导致的问题无法重现,同时也为了可以在解决bug的过程中使用一些特别的手段而不影响用户的使用,这里通过备份建立了一个测试环境,下面的操作是在测试环境中执行. 首先修改统计信息对应的JOB的NEXT_DATE,使其在后台执行,检查收集统计信息后,测试数据库上是否能重现问题: SQL> SELECT JOB, WHAT FROM USER_JOBS; JOB WHAT ---