Oracle dbms_stats
.
第一部分:Gathering Optimizer Statistics
1. GATHER_DATABASE_STATS
收集数据库中所有对象的统计信息
Parameters:
--estimate_percent: 需分析的百分比(NULL means compute),默认值可以通过SET_PARAM来改变。The valid range is [0.000001,100]
--block_sample:无论是否是随机块采样替代随机行采样,随机块采样的效率都会比较高。除非数据不是随机分布在磁盘上的。DEFAULT FALSE
--method_opt:
FOR ALL [INDEXED | HIDDEN] COLUMNS[size_clause]
FOR COLUMNS[size clause] column|attribute [size_clause] [,column|attribute [size_clause]...]
size_clause is defined as size_clause := SIZE {integer | REPEAT | AUTO | SKEWONLY}
- integer: Number of histogram buckets. Must be in the range [1,254].- REPEAT: Collects histograms only on the columns that already have histograms.- AUTO: Oracle determines the columns to collect histograms based ondata distribution and the workload of the columns.- SKEWONLY: Oracle determines the columns to collect histograms based on thedata distribution of the columns.
The default is FOR ALL COLUMNS SIZE AUTO.默认值可以通过SET_PARAM来改变
--degree:并行度,The default for degree is NULL.
--granularity:只有分区表才会用到此参数
--cascade:是否要统计此表上的index,默认为false,默认值可以通过SET_PARAM来改变
--Stattab:User statistics table identifier describing where to save the current statistics.
--Statid:Identifier (optional) to associate with these statistics withinstattab.
--options:默认值GATHER(Gathers statistics on all objects in the schema),
其它选项:
GATHERAUTO: Gathers all necessary statistics automatically
GATHERSTALE: Gathers statistics on stale objects as determined by looking at the *_tab_modificationsviews.
GATHEREMPTY: Gathers statistics on objects which currently have no statistics.
LIST AUTO: Returns a list of objects to be processed with GATHER AUTO, When GATHER AUTO is specified, the only additional valid parameters are stattab, statid, objlist and statown;
LISTSTALE: Returns a list of stale objects as determined by looking at the *_tab_modifications views.
LISTEMPTY: Returns a list of objects which currently have no statistics.
--objlist: List of objects found to be stale or empty
--statown: Schema containingstattab(if different from current schema)
--gather_sys: Gathers statistics on the objects owned by the'SYS'user,默认值TRUE
--no_invalidate: 设置为TRUE时,相关的游标不会失效; 反之,游标失效。
2. GATHER_DICTIONARY_STATS
此过程收集统计数据字典用户’SYS’,’SYSTEM’以及RDBMS组件用户.
必须有SYSDBA或ANALYZEANYDICTIONARY和ANALYZEANYSYSTEM权限才能执行此过程。
参数:
--comp_id:指定需统计用户的COMP_ID,通过DBA_REGISTRY视图来查看COMP_ID。如此值为NULL,则统计所有RDBMS组件的用户。此管是否有此参数,’SYS’,’SYSTEM’用户都会被统计。
其它参数estimate_percent--block_sample --method_opt –degree –granularity –cascade –stattab –statid –options –objlist –statown --no_invalidate都同上
3. GATHER_FIXED_OBJECTS_STATS
此过程收集统计所有的动态性能表
必须有SYSDBA或具有ANALYZEANYDICTIONARY权限才能执行此过程。
参数:stattab –statid –statown --no_invalidate
4. GATHER_INDEX_STATS
此过程收集索引的统计。一些参数被限制的,不会并行处理cluster indexes, domain indexes,和bitmap join indexes,granularity和no_invalidate参数在这些index中不起作用。
参数:
--ownname:被统计的schema
-- indname:index名
--Partname:Name of partition
--force:即使表被锁定,也强行统计
--estimate_percent–stattab –statid–statown–degree–granularity --no_invalidate都同上
5. GATHER_SCHEMA_STATS
此过程收集统计某用户下所有的对象
参数:
--ownname:需分析的schema, null时则为当前schema
--estimate_percent --block_sample--method_opt–degree–granularity–cascade –stattab –statid–options –objlist –statown --no_invalidate都同上
6. GATHER_SYSTEM_STATS
此过程收集系统统计,用来系统的cpu和IO指标
参数:
--gathering_mode:
-NOWORKLOAD,收集I/O的性能指标,数据库的大小决定收集时间。收集期间ORACLE将评估IO平均的读取寻道时间和传输速度。
-INTERVAL,指定统计的时间(分钟数),统计完成后,统计信息将建立或更新在数据字典或指定的stattab中。在统计期间可以用GATHER_SYSTEM_STATS (gathering_mode=>'STOP')来中断统计。
SQL> exec dbms_stats.gather_system_stats('interval',15);
SQL> exec dbms_stats.gather_system_stats('stop');
SQL>select pname,pval1 from sys.aux_stats$; --查看统计结果
-START|STOP:开始和结束统计
--interval:指定统计的分钟数,当上面的参数是INTERVAL时才用此参数
--no_invalidate:设置为TRUE时,相关的游标不会失效;反之,游标失效。
–statid–statown同上
7. GATHER_TABLE_STATS
此过程统计table and column (and index)信息。
参数:
Ownname:用户名
Tabname:TABLE名
Partname:分区名Name of partition
--estimate_percent --block_sample--Method_opt–degree–granularity–cascade –stattab –statid –statown --no_invalidate--force都同上
第二部分:Setting or Getting Statistics
1. SET_COLUMN_STATS
设置列相关信息
参数:
--ownname:用户名
--tabname:TABLE名
--colname:列名
--partname:分区名
--stattab:指定存放用户分析的数据的表名
--statid:stattab的ID,只有当stattab没有指定时使用
--ext_stats:自定义的统计
--stattypown:统计类型的所属用户
--STATTYPNAME:统计类型的名称
--distinct:有多少个值(number of distinct values)
--density:列密度。如果此值是null且distinct不为空,那么此值将参照distinct
--nullcnt:number of NULLS
--srec:StatRecstructure filled in by a call to PREPARE_COLUMN_VALUES or GET_COLUMN_STATS
--avgclen:列的平均长度(in bytes)
--flags:ORACLE内部使用,应该为NULL
--statown:Schema containing stattab (if different than ownname)
--no_invalidate:设置为TRUE时,相关的游标不会失效;反之,游标失效。
--force:被设置的column被锁时也强行设置
2. SET_INDEX_STATS
设置索引相关信息
3. SET_PARAM
此过程是用来设置DBMS_STATS的值的,可以用GET_PARAM函数来得到参数的当前值。
参数:
--pname:可以是CASCADE,DEGREE,EASTIMAT_PERCENT,METHOD_OPT,NO_INVALIDATE,GRANULARITY,AUTOSTATS_TARGET
--pval:参数的值。如果是NULL,则设成默认值。
To run this procedure, you must have theSYSDBAor both theANALYZEANYDICTIONARYandANALYZEANYsystem privileges
举例:
DBMS_STATS.SET_PARAM('CASCADE','DBMS_STATS.AUTO_CASCADE');
DBMS_STATS.SET_PARAM('ESTIMATE_PERCENT','5');
DBMS_STATS.SET_PARAM('DEGREE','NULL');
4. SET_SYSTEM_STATS
设置系统的统计
参数:
--pname:
--iotfrspeed:IO的传输速度/毫秒
--ioseektim:seek time + latency time + operating system overhead time, in milliseconds
--sreadtim:average time to read single block (random read), in milliseconds
--mreadtim:average time to read an mbrc block at once (sequential read), in milliseconds
--cpuspeed:average number of CPU cycles for each second, in millions, captured for the workload (statistics collected using 'INTERVAL' or 'START' and 'STOP' options)
--cpuspeednw:average number of CPU cycles for each second, in millions, captured for the noworkload (statistics collected using 'NOWORKLOAD' option.
--mbrc:average multiblock read count for sequential read, in blocks
--maxthr:I/O的最大吞吐量,bytes/second
--slavethr:average slave I/O throughput, in bytes/second
--pvalue:参数的值
--stattab:指定存放用户分析的数据的表名
--statid:用户ID
--statown:stattab指定表的所属用户
--cachedblk:段在buffer cache中的平均块数
--cachehit:段的平均命中率
5.SET_TABLE_STATS
设置表的统计
参数:
--ownname,--tabname,--partname,--stattab,--statid同上
--numrows:表中有多少行
--numblks:表占用了多少块
--avgrlen:平均的行长度
--flags,--statown,--no_invalidate,--cachedblk,--cachehit,--force同上
6. PREPARE_COLUMN_VALUES
7. PREPARE_COLUMN_VALUES_NVARCHAR2
8. PREPARE_COLUMN_VALUES_ROWID
9. GET_COLUMN_STATS Procedures
取栏位的统计信息
参数:
--ownname,--tabname,--colname, --partname,--stattab,--statid, --ext_stats, --stattypown, --STATTYPNAME, --distinct, --density, --nullcnt,--srec,--avgclen,--statown
10. GET_INDEX_STATS
取索引的统计信息
参数
--ownname,--indname,--partname,--stattab,--statid,--ext_stats,--stattypown,--STATTYPNAME, --numrows, --numblks
--numdist:Number of distinct keys in the index (partition)
--avglblk:Average integral number of leaf blocks in which each distinct key appears for this index (partition)
--avgdblk:Average integral number of data blocks in the table pointed to by a distinct key for this index (partition)
--clstfct:Clustering factor for the index (partition)
--indlevel:Height of the index (partition)
--statown:stattab的用户名
--guessq:估计INDEX的质量
--cachedblk:段在buffer cache中的平均块数
--cachehit:段的平均命中率
11.GET_SYSTEM_STATS
此过程取系统的统计信息
语法:
DBMS_STATS.GET_SYSTEM_STATS (
statusOUTVARCHAR2,
dstartOUTDATE,
dstopOUTDATE,
pnameVARCHAR2,
pvalueOUTNUMBER,
stattabINVARCHAR2 DEFAULT NULL,
statidINVARCHAR2 DEFAULT NULL,
statownINVARCHAR2 DEFAULT NULL);
参数:
--Status:会输出以下值之一COMPLETED,AUTOGATHERING,MANUALGATHERING,BADSTATS
--dstart:收集分析开始的时间
--dstop:收集分析结束的时间
--pname:需要获取值的参数,可选的值有:iotfrspeed,ioseektim,sreadtim,mreadtim,cpuspeed,cpuspeednw,mbrc,maxthr,slavethr
--pvalue:值
--stattab:统计表所表名,如果此值为null,则会从数据字典中取。
--statid:stattab的id
--statown:stattab的own
12.GET_TABLE_STATUS
取table相关的统计信息
语法:
DBMS_STATS.GET_TABLE_STATS (
ownnameVARCHAR2,
tabnameVARCHAR2,
partnameVARCHAR2 DEFAULT NULL,
stattabVARCHAR2 DEFAULT NULL,
statidVARCHAR2 DEFAULT NULL,
numrowsOUT NUMBER,
numblksOUT NUMBER,
avgrlenOUT NUMBER,
statownVARCHAR2 DEFAULT NULL,
cachedblkOUT NUMBER,
cachehitOUT NUMBER);
13.CREATE_STAT_TABLE
此过程建立stattab的TABLE,以保存统计信息。
语法:
DBMS_STATS.CREATE_STAT_TABLE (
ownnameVARCHAR2,
stattabVARCHAR2,
tblspace VARCHAR2 DEFAULT NULL);
参数:
--ownname:用户名
--stattab:需建立的stattab表名。
--tblspace:stattab的tablespace.如果为null则会使用用户的默认表空间
14.DROP_STAT_TABLE
此过程删除用户定义的统计表
语法:
DBMS_STATS.DROP_STAT_TABLE (
ownname VARCHAR2,
stattab VARCHAR2);
第三部分Deleting Statistics
1.DELETE_COLUMN_STATS
语法:
DBMS_STATS.DELETE_COLUMN_STATS (
ownnameVARCHAR2,
tabnameVARCHAR2,
colnameVARCHAR2,
partnameVARCHAR2 DEFAULT NULL,
stattabVARCHAR2 DEFAULT NULL,
statidVARCHAR2 DEFAULT NULL,
cascade_parts BOOLEANDEFAULT TRUE,
statownVARCHAR2 DEFAULT NULL,
no_invalidate BOOLEANDEFAULT to_no_invalidate_type (
get_param('NO_INVALIDATE')),
forceBOOLEAN DEFAULT FALSE);
参数:
--ownname:table所属用户名
--tabname:表名
--colname:column
--partname:分区名
--stattab:统计表名,如果为null,则从数据字典中取
--statid:stattab的id(当stattab为null时才需指定)
--cascade_parts:如果指定的表是分区表且partname是null,此值为TRUE时会删除所有指定字段分区的统计信息。
--statown:stattab的owner
--no_invalidate:如设为TRUE,相关的游标不失效。
--force:When value of this argument is TRUE, deletes column statistics even if locked
2. DELETE_DATABASE_STATS
此过程删除数据库中所有TABLE的统计信息
语法:
DBMS_STATS.DELETE_DATABASE_STATS (
stattabVARCHAR2 DEFAULT NULL,
statidVARCHAR2 DEFAULT NULL,
statownVARCHAR2 DEFAULT NULL,
no_invalidateBOOLEANDEFAULT to_no_invalidate_type (
get_param('NO_INVALIDATE')),
forceBOOLEANDEFAULT FALSE);
3.DELETE_DICTIONARY_STATS
此过程删除'SYS', 'SYSTEM' and RDBMS component schemas的统计信息
分析表中的index
execute dbms_stats.gather_table_stats(ownname => 'tab',tabname => 'HWM',method_opt =>'for all indexed columns size auto');
分析指定列 buket 5
execute dbms_stats.gather_table_stats(ownname => 'LINYU',tabname => 'HWM',method_opt =>'for columns OWNER size 5');
收集指定column的统计信息时,会自动把对应的index的信息收集起来.
删除指定表的统计信息
execute dbms_stats.delete_table_stats(ownname => 'LINYU',tabname => 'HWM');
删除指定列
execute dbms_stats.delete_column_stats(ownname => 'LINYU',tabname => 'HWM',colname => 'OWNER');
例子:
分析表中的index
execute dbms_stats.gather_table_stats(ownname => 'tab',tabname => 'HWM',method_opt =>'for all indexed columns size auto');
分析指定列 buket 5
execute dbms_stats.gather_table_stats(ownname => 'LINYU',tabname => 'HWM',method_opt =>'for columns OWNER size 5');
收集指定column的统计信息时,会自动把对应的index的信息收集起来.
删除指定表的统计信息
execute dbms_stats.delete_table_stats(ownname => 'LINYU',tabname => 'HWM');
删除指定列
execute dbms_stats.delete_column_stats(ownname => 'LINYU',tabname => 'HWM',colname => 'OWNER');