0
点赞
收藏
分享

微信扫一扫

Daily Management Oracle table statistics(原创)


 



This article purpose is to record some daily oracle table statisics management procedure usage and some tips for while manage table statistics. Not big deal, if you're familiar with this, pass it.

GATHER_INDEX_STATS Procedure

 

This procedure gathers index statistics. It attempts to parallelize as much of the work as possible. Restrictions are described in the individual parameters. This operation will not parallelize with certain types of indexes, including cluster indexes, domain indexes, and bitmap join indexes. The ​​granularity​​​ and ​​no_invalidate​​ arguments are not relevant to these types of indexes.

 



Syntax

DBMS_STATS.GATHER_INDEX_STATS (
ownname VARCHAR2,
indname VARCHAR2,
partname VARCHAR2 DEFAULT NULL,
estimate_percent NUMBER DEFAULT to_estimate_percent_type
(GET_PARAM('ESTIMATE_PERCENT')),
stattab VARCHAR2 DEFAULT NULL,
statid VARCHAR2 DEFAULT NULL,
statown VARCHAR2 DEFAULT NULL,
degree NUMBER DEFAULT to_degree_type(get_param('DEGREE')),
granularity VARCHAR2 DEFAULT GET_PARAM('GRANULARITY'),
no_invalidate BOOLEAN DEFAULT to_no_invalidate_type
(GET_PARAM('NO_INVALIDATE')),
force BOOLEAN DEFAULT FALSE);



 



Parameters



Table 142-42 GATHER_INDEX_STATS Procedure Parameters

Parameter

Description

​ownname​

Schema of index to analyze

​indname​

Name of index

​partname​

Name of partition

​estimate_percent​

Percentage of rows to estimate (​​NULL​​​ means compute). The valid range is ​​[0.000001,100]​​​. Use the constant ​​DBMS_STATS​​​.​​AUTO_SAMPLE_SIZE​​​ to have Oracle determine the appropriate sample size for good statistics. This is the default.The default value can be changed using the ​​SET_DATABASE_PREFS Procedure​​​, ​​SET_GLOBAL_PREFS Procedure​​​, ​​SET_SCHEMA_PREFS Procedure​​​ and ​​SET_TABLE_PREFS Procedure​​.

​stattab​

User statistics table identifier describing where to save the current statistics

​statid​

Identifier (optional) to associate with these statistics within ​​stattab​

​statown​

Schema containing ​​stattab​​​ (if different than ​​ownname​​)

​degree​

Degree of parallelism. The default for ​​degree​​​ is ​​NULL​​​. The default value can be changed using the ​​SET_DATABASE_PREFS Procedure​​​, ​​SET_GLOBAL_PREFS Procedure​​​, ​​SET_SCHEMA_PREFS Procedure​​​ and ​​SET_TABLE_PREFS Procedure​​​. ​​NULL​​​ means use the table default value specified by the ​​DEGREE​​​ clause in the ​​CREATE TABLE​​​ or ​​ALTER TABLE​​​ statement. Use the constant ​​DBMS_STATS.DEFAULT_DEGREE​​​ to specify the default value based on the initialization parameters. The ​​AUTO_DEGREE​​​ value determines the degree of parallelism automatically. This is between ​​1​​​ (serial execution) and ​​DEFAULT_DEGREE​​​ (the system default value based on number of CPUs and initialization parameters) according to the size of the object. When using ​​DEGREE=>NULL​​​, ​​DEGREE=>n​​​, or ​​DEGREE=>DBMS_STATS.DEFAULT_DEGREE​​​, the current implementation of ​​DBMS_STATS​​ may use serial execution if the size of the object does not warrant parallel execution.

​granularity​

Granularity of statistics to collect (only pertinent if the table is partitioned).

​'ALL'​​ - Gathers all (subpartition, partition, and global) statistics

​'AUTO'​​- Determines the granularity based on the partitioning type. This is the default value.

​'DEFAULT'​​​ - Gathers global and partition-level statistics. This option is obsolete, and while currently supported, it is included in the documentation for legacy reasons only. You should use the '​​GLOBAL AND PARTITION​​​' for this functionality. Note that the default value is now '​​AUTO​​'.

​'GLOBAL'​​ - Gathers global statistics

'​​GLOBAL AND PARTITION​​' - Gathers the global and partition level statistics. No subpartition level statistics are gathered even if it is a composite partitioned object.

​'PARTITION​​ '- Gathers partition-level statistics

​'SUBPARTITION'​​ - Gathers subpartition-level statistics.

​no_invalidate​

Does not invalidate the dependent cursors if set to ​​TRUE​​​. The procedure invalidates the dependent cursors immediately if set to ​​FALSE​​​. Use ​​DBMS_STATS​​​.​​AUTO_INVALIDATE​​​. to have Oracle decide when to invalidate dependent cursors. This is the default. The default can be changed using the ​​SET_DATABASE_PREFS Procedure​​​, ​​SET_GLOBAL_PREFS Procedure​​​, ​​SET_SCHEMA_PREFS Procedure​​​ and ​​SET_TABLE_PREFS Procedure​​.

​force​

Gather statistics on object even if it is locked



 



Exceptions

​ORA-20000​​: Index does not exist or insufficient privileges

​ORA-20001​​: Bad input value



 



Usage Notes

To invoke this procedure you must be owner of the table, or you need the ​​ANALYZE​​​ ​​ANY​​​ privilege. For objects owned by ​​SYS​​​, you need to be either the owner of the table, or you need the ​​ANALYZE​​​ ​​ANY​​​ ​​DICTIONARY​​​ privilege or the ​​SYSDBA​​ privilege.



 



GATHER_SCHEMA_STATS Procedures

This procedure gathers statistics for all objects in a schema.



Syntax

DBMS_STATS.GATHER_SCHEMA_STATS ( 
ownname VARCHAR2,
estimate_percent NUMBER DEFAULT to_estimate_percent_type
(get_param('ESTIMATE_PERCENT')),
block_sample BOOLEAN DEFAULT FALSE,
method_opt VARCHAR2 DEFAULT get_param('METHOD_OPT'),
degree NUMBER DEFAULT to_degree_type(get_param('DEGREE')),
granularity VARCHAR2 DEFAULT GET_PARAM('GRANULARITY'),
cascade BOOLEAN DEFAULT to_cascade_type(get_param('CASCADE')),
stattab VARCHAR2 DEFAULT NULL,
statid VARCHAR2 DEFAULT NULL,
options VARCHAR2 DEFAULT 'GATHER',
objlist OUT ObjectTab,
statown VARCHAR2 DEFAULT NULL,
no_invalidate BOOLEAN DEFAULT to_no_invalidate_type (
get_param('NO_INVALIDATE')),
force BOOLEAN DEFAULT FALSE,
obj_filter_list ObjectTab DEFAULT NULL);

DBMS_STATS.GATHER_SCHEMA_STATS (
ownname VARCHAR2,
estimate_percent NUMBER DEFAULT to_estimate_percent_type
(get_param('ESTIMATE_PERCENT')),
block_sample BOOLEAN DEFAULT FALSE,
method_opt VARCHAR2 DEFAULT get_param('METHOD_OPT'),
degree NUMBER DEFAULT to_degree_type(get_param('DEGREE')),
granularity VARCHAR2 DEFAULT GET_PARAM('GRANULARITY'),
cascade BOOLEAN DEFAULT to_cascade_type(get_param('CASCADE')),
stattab VARCHAR2 DEFAULT NULL,
statid VARCHAR2 DEFAULT NULL,
options VARCHAR2 DEFAULT 'GATHER',
statown VARCHAR2 DEFAULT NULL,
no_invalidate BOOLEAN DEFAULT to_no_invalidate_type (
get_param('NO_INVALIDATE'),
force BOOLEAN DEFAULT FALSE,
obj_filter_list ObjectTab DEFAULT NULL);



Parameters



Table 142-43 GATHER_SCHEMA_STATS Procedure Parameters

Parameter

Description

​ownname​

Schema to analyze (​​NULL​​ means current schema)

​estimate_percent​

Percentage of rows to estimate (​​NULL​​​ means compute): The valid range is [0.000001,100]. Use the constant ​​DBMS_STATS​​​.​​AUTO_SAMPLE_SIZE​​​ to have Oracle determine the appropriate sample size for good statistics. This is the default.The default value can be changed using the ​​SET_DATABASE_PREFS Procedure​​​, ​​SET_GLOBAL_PREFS Procedure​​​, ​​SET_SCHEMA_PREFS Procedure​​​ and ​​SET_TABLE_PREFS Procedure​​.

​block_sample​

Whether or not to use random block sampling instead of random row sampling. Random block sampling is more efficient, but if the data is not randomly distributed on disk, then the sample values may be somewhat correlated. Only pertinent when doing an estimate statistics.

​method_opt​

Accepts:

  • ​FOR ALL [INDEXED | HIDDEN] COLUMNS​​​ ​​[size_clause]​
  • ​FOR COLUMNS [size clause] column [size_clause] [,column [size_clause]...]​

​size_clause​​​ is defined as ​​size_clause := SIZE {integer | REPEAT | AUTO | SKEWONLY}​

​column​​​ is defined as ​​column := column_name | extension name | extension​


​- 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 on which to collect histograms based on data distribution and the workload of the columns.

​- SKEWONLY​​ : Oracle determines the columns on which to collect histograms based on the data distribution of the columns.

The default is ​​FOR ALL COLUMNS SIZE AUTO​​​.The default value can be changed using the ​​SET_DATABASE_PREFS Procedure​​​, ​​SET_GLOBAL_PREFS Procedure​​​, ​​SET_SCHEMA_PREFS Procedure​​​ and ​​SET_TABLE_PREFS Procedure​​.

​degree​

Degree of parallelism. The default for ​​degree​​​ is ​​NULL​​​. The default value can be changed using the ​​SET_DATABASE_PREFS Procedure​​​, ​​SET_GLOBAL_PREFS Procedure​​​, ​​SET_SCHEMA_PREFS Procedure​​​ and ​​SET_TABLE_PREFS Procedure​​​. ​​NULL​​​ means use the table default value specified by the ​​DEGREE​​​ clause in the ​​CREATE TABLE​​​ or ​​ALTER TABLE​​​ statement. Use the constant ​​DBMS_STATS.DEFAULT_DEGREE​​​ to specify the default value based on the initialization parameters. The ​​AUTO_DEGREE​​​ value determines the degree of parallelism automatically. This is between ​​1​​​ (serial execution) and ​​DEFAULT_DEGREE​​​ (the system default value based on number of CPUs and initialization parameters) according to the size of the object. When using ​​DEGREE=>NULL​​​, ​​DEGREE=>n​​​, or ​​DEGREE=>DBMS_STATS.DEFAULT_DEGREE​​​, the current implementation of ​​DBMS_STATS​​ may use serial execution if the size of the object does not warrant parallel execution.

​granularity​

Granularity of statistics to collect (only pertinent if the table is partitioned).

​'ALL'​​ - Gathers all (subpartition, partition, and global) statistics

​'AUTO'​​- Determines the granularity based on the partitioning type. This is the default value.

​'DEFAULT'​​​ - Gathers global and partition-level statistics. This option is obsolete, and while currently supported, it is included in the documentation for legacy reasons only. You should use the '​​GLOBAL AND PARTITION​​​' for this functionality. Note that the default value is now '​​AUTO​​'.

​'GLOBAL'​​ - Gathers global statistics

'​​GLOBAL AND PARTITION​​' - Gathers the global and partition level statistics. No subpartition level statistics are gathered even if it is a composite partitioned object.

​'PARTITION​​ '- Gathers partition-level statistics

​'SUBPARTITION'​​ - Gathers subpartition-level statistics.

​cascade​

Gather statistics on the indexes as well. Using this option is equivalent to running the ​​GATHER_INDEX_STATS Procedure​​​ on each of the indexes in the schema in addition to gathering table and column statistics. Use the constant ​​DBMS_STATS.AUTO_CASCADE​​​ to have Oracle determine whether index statistics to be collected or not. This is the default. The default value can be changed using the ​​SET_DATABASE_PREFS Procedure​​​, ​​SET_GLOBAL_PREFS Procedure​​​, ​​SET_SCHEMA_PREFS Procedure​​​ and ​​SET_TABLE_PREFS Procedure​​.

​stattab​

User statistics table identifier describing where to save the current statistics

​statid​

Identifier (optional) to associate with these statistics within ​​stattab​

​options​

Further specification of which objects to gather statistics for:

​GATHER​​: Gathers statistics on all objects in the schema.

​GATHER​​​ ​​AUTO​​​: Gathers all necessary statistics automatically. Oracle implicitly determines which objects need new statistics, and determines how to gather those statistics. When ​​GATHER AUTO​​​ is specified, the only additional valid parameters are ​​ownname​​​, ​​stattab​​​, ​​statid​​​, ​​objlist​​​ and ​​statown​​; all other parameter settings are ignored. Returns a list of processed objects.

​GATHER​​​ ​​STALE​​​: Gathers statistics on stale objects as determined by looking at the *​​_tab_modifications​​ views. Also, return a list of objects found to be stale.

​GATHER​​​ ​​EMPTY​​: Gathers statistics on objects which currently have no statistics. also, return a list of objects found to have no statistics.

​LIST AUTO​​​: Returns a list of objects to be processed with ​​GATHER AUTO​​.

​LIST​​​ ​​STALE​​​: Returns list of stale objects as determined by looking at the *​​_tab_modifications​​ views.

​LIST​​​ ​​EMPTY​​: Returns list of objects which currently have no statistics.

​objlist​

List of objects found to be stale or empty

​statown​

Schema containing ​​stattab​​​ (if different than ​​ownname​​)

​no_invalidate​

Does not invalidate the dependent cursors if set to ​​TRUE​​​. The procedure invalidates the dependent cursors immediately if set to ​​FALSE​​​. Use ​​DBMS_STATS​​​.​​AUTO_INVALIDATE​​​. to have Oracle decide when to invalidate dependent cursors. This is the default. The default can be changed using the ​​SET_DATABASE_PREFS Procedure​​​, ​​SET_GLOBAL_PREFS Procedure​​​, ​​SET_SCHEMA_PREFS Procedure​​​ and ​​SET_TABLE_PREFS Procedure​​.

​force​

Gather statistics on objects even if they are locked

​obj_filter_list​

A list of object filters. When provided, ​​GATHER_SCHEMA_STATS​​​ will gather statistics only on objects which satisfy at least one object filter in the list as needed. In a single object filter, we can specify the constraints on the object attributes. The attribute values specified in the object filter are case- insensitive unless double-quoted. Wildcard is allowed in the attribute values. Suppose non-​​NULL​​​ values s1, s2, ... are specified for attributes a1, a2, ... in one object filter. An object o is said to satisfy this object filter if (o.a1 like s1) and (o.a2 like s2) and ... is true. See ​​Applying an Object Filter List​​.



Exceptions

​ORA-20000​​: Schema does not exist or insufficient privileges

​ORA-20001​​: Bad input value



Usage Notes

To invoke this procedure you must be owner of the table, or you need the ​​ANALYZE​​​ ​​ANY​​​ privilege. For objects owned by ​​SYS​​​, you need to be either the owner of the table, or you need the ​​ANALYZE​​​ ​​ANY​​​ ​​DICTIONARY​​​ privilege or the ​​SYSDBA​​ privilege.

When you use a specific value for the sampling percentage, ​​DBMS_STATS​​ honors it except for when:

  • The result is less than 2500 rows (too small a sample) and
  • The specified percentage is more than the certain percentage.



Examples

Applying an Object Filter List

The following example specifies that any table with a "​​T​​​" prefix in the ​​SAMPLE​​​ schema and any table in the ​​SYS​​ schema, if stale, will have statistics gathered upon it.

DECLARE
filter_lst DBMS_STATS.OBJECTTAB := DBMS_STATS.OBJECTTAB();
BEGIN
filter_lst.extend(2);
filter_lst(1).ownname := 'SH';
filter_lst(1).objname := 'SALES';
filter_lst(2).ownname := 'SH';
filter_lst(2).objname := 'COSTS';
DBMS_STATS.GATHER_SCHEMA_STATS(ownname=>'SH',obj_filter_list=>filter_lst);
END;



GATHER_TABLE_STATS Procedure

This procedure gathers table and column (and index) statistics. It attempts to parallelize as much of the work as possible, but there are some restrictions as described in the individual parameters.



Syntax

DBMS_STATS.GATHER_TABLE_STATS (
ownname VARCHAR2,
tabname VARCHAR2,
partname VARCHAR2 DEFAULT NULL,
estimate_percent NUMBER DEFAULT to_estimate_percent_type
(get_param('ESTIMATE_PERCENT')),
block_sample BOOLEAN DEFAULT FALSE,
method_opt VARCHAR2 DEFAULT get_param('METHOD_OPT'),
degree NUMBER DEFAULT to_degree_type(get_param('DEGREE')),
granularity VARCHAR2 DEFAULT GET_PARAM('GRANULARITY'),
cascade BOOLEAN DEFAULT to_cascade_type(get_param('CASCADE')),
stattab VARCHAR2 DEFAULT NULL,
statid VARCHAR2 DEFAULT NULL,
statown VARCHAR2 DEFAULT NULL,
no_invalidate BOOLEAN DEFAULT to_no_invalidate_type (
get_param('NO_INVALIDATE')),
stattype VARCHAR2 DEFAULT 'DATA',
force BOOLEAN DEFAULT FALSE);



Parameters



Table 142-45 GATHER_TABLE_STATS Procedure Parameters

Parameter

Description

​ownname​

Schema of table to analyze

​tabname​

Name of table

​partname​

Name of partition

​estimate_percent​

Percentage of rows to estimate (​​NULL​​​ means compute) The valid range is [0.000001,100]. Use the constant ​​DBMS_STATS​​​.​​AUTO_SAMPLE_SIZE​​​ to have Oracle determine the appropriate sample size for good statistics. This is the default.The default value can be changed using the ​​SET_DATABASE_PREFS Procedure​​​, ​​SET_GLOBAL_PREFS Procedure​​​, ​​SET_SCHEMA_PREFS Procedure​​​ and ​​SET_TABLE_PREFS Procedure​​.

​block_sample​

Whether or not to use random block sampling instead of random row sampling. Random block sampling is more efficient, but if the data is not randomly distributed on disk, then the sample values may be somewhat correlated. Only pertinent when doing an estimate statistics.

​method_opt​

Accepts either of the following options, or both in combination:

  • ​FOR ALL [INDEXED | HIDDEN] COLUMNS​​​ ​​[size_clause]​
  • ​FOR COLUMNS [size clause] column [size_clause] [,column [size_clause]...]​

​size_clause​​​ is defined as ​​size_clause := SIZE {integer | REPEAT | AUTO | SKEWONLY}​

​column​​​ is defined as ​​column := column_name | extension name | extension​


​- 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 on which to collect histograms based on data distribution and the workload of the columns.

​- SKEWONLY​​ : Oracle determines the columns on which to collect histograms based on the data distribution of the columns.

- ​​column_name​​ : Name of a column

- ​​extension :​​​ can be either a column group in the format of (​​column_name​​​, ​​Colume_name​​ [, ...]) or an expression

The default is ​​FOR ALL COLUMNS SIZE AUTO​​​. The default value can be changed using the ​​SET_DATABASE_PREFS Procedure​​​, ​​SET_GLOBAL_PREFS Procedure​​​, ​​SET_SCHEMA_PREFS Procedure​​​ and ​​SET_TABLE_PREFS Procedure​​.

​degree​

Degree of parallelism. The default for ​​degree​​​ is ​​NULL​​​. The default value can be changed using the ​​SET_DATABASE_PREFS Procedure​​​, ​​SET_GLOBAL_PREFS Procedure​​​, ​​SET_SCHEMA_PREFS Procedure​​​ and ​​SET_TABLE_PREFS Procedure​​​. ​​NULL​​​ means use the table default value specified by the ​​DEGREE​​​ clause in the ​​CREATE TABLE​​​ or ​​ALTER TABLE​​​ statement. Use the constant ​​DBMS_STATS.DEFAULT_DEGREE​​​ to specify the default value based on the initialization parameters. The ​​AUTO_DEGREE​​​ value determines the degree of parallelism automatically. This is between ​​1​​​ (serial execution) and ​​DEFAULT_DEGREE​​​ (the system default value based on number of CPUs and initialization parameters) according to the size of the object. When using ​​DEGREE=>NULL​​​, ​​DEGREE=>n​​​, or ​​DEGREE=>DBMS_STATS.DEFAULT_DEGREE​​​, the current implementation of ​​DBMS_STATS​​ may use serial execution if the size of the object does not warrant parallel execution.

​granularity​

Granularity of statistics to collect (only pertinent if the table is partitioned).

​'ALL'​​ - Gathers all (subpartition, partition, and global) statistics

​'APPROX_GLOBAL AND PARTITION'​​​ - similar to ​​'GLOBAL AND PARTITION'​​​ but in this case the global statistics are aggregated from partition level statistics. This option will aggregate all statistics except the number of distinct values for columns and number of distinct keys of indexes. The existing histograms of the columns at the table level are also aggregated.The aggregation will use only partitions with statistics, so to get accurate global statistics, users should make sure to have statistics for all partitions. Global statistics are gathered if ​​partname​​​ is ​​NULL​​ or if the aggregation cannot be performed (for example, if statistics for one of the partitions is missing).

​'AUTO'​​- Determines the granularity based on the partitioning type. This is the default value.

​'DEFAULT'​​​ - Gathers global and partition-level statistics. This option is obsolete, and while currently supported, it is included in the documentation for legacy reasons only. You should use the '​​GLOBAL AND PARTITION​​​' for this functionality. Note that the default value is now '​​AUTO​​'.

​'GLOBAL'​​ - Gathers global statistics

'​​GLOBAL AND PARTITION​​' - Gathers the global and partition level statistics. No subpartition level statistics are gathered even if it is a composite partitioned object.

​'PARTITION​​ '- Gathers partition-level statistics

​'SUBPARTITION'​​ - Gathers subpartition-level statistics.

​cascade​

Gathers statistics on the indexes for this table. Using this option is equivalent to running the ​​GATHER_INDEX_STATS Procedure​​​ on each of the table's indexes. Use the constant ​​DBMS_STATS.AUTO_CASCADE​​​ to have Oracle determine whether index statistics are to be collected or not. This is the default. The default value can be changed using the ​​SET_DATABASE_PREFS Procedure​​​, ​​SET_GLOBAL_PREFS Procedure​​​, ​​SET_SCHEMA_PREFS Procedure​​​ and ​​SET_TABLE_PREFS Procedure​​​​.​

​stattab​

User statistics table identifier describing where to save the current statistics

​statid​

Identifier (optional) to associate with these statistics within ​​stattab​

​statown​

Schema containing ​​stattab​​​ (if different than ​​ownname​​)

​no_invalidate​

Does not invalidate the dependent cursors if set to ​​TRUE​​​. The procedure invalidates the dependent cursors immediately if set to ​​FALSE​​​. Use ​​DBMS_STATS​​​.​​AUTO_INVALIDATE​​​. to have Oracle decide when to invalidate dependent cursors. This is the default. The default can be changed using the ​​SET_DATABASE_PREFS Procedure​​​, ​​SET_GLOBAL_PREFS Procedure​​​, ​​SET_SCHEMA_PREFS Procedure​​​ and ​​SET_TABLE_PREFS Procedure​​.

​stattype​

Statistics type. The only value allowed is ​​DATA​​.

​force​

Gather statistics of table even if it is locked



Exceptions

​ORA-20000​​: Table does not exist or insufficient privileges

​ORA-20001​​: Bad input value



Usage Notes

To invoke this procedure you must be owner of the table, or you need the ​​ANALYZE​​​ ​​ANY​​​ privilege. For objects owned by ​​SYS​​​, you need to be either the owner of the table, or you need the ​​ANALYZE​​​ ​​ANY​​​ ​​DICTIONARY​​​ privilege or the ​​SYSDBA​​ privilege.

Index statistics collection can be parellelized except for cluster, domain and join indexes.



Examples

An extension can be either a column group (see Example 1) or an expression (see Example 2).

Example 1

DBMS_STATS.GATHER_TABLE_STATS(
'SH', 'SALES', method_opt => 'FOR COLUMNS (empno, deptno)');

Example 2

DBMS_STATS.GATHER_TABLE_STATS(
'SH', 'SALES', method_opt => 'FOR COLUMNS (sal+comm)');





SET_INDEX_STATS Procedures

 

These procedures set index-related information. In the version of this procedure that deals with user-defined statistics, the statistics type specified is the type to store in the dictionary, in addition to the actual user-defined statistics. If this statistics type is NULL, the statistics type associated with the index or column is stored.

 



Syntax

DBMS_STATS.SET_INDEX_STATS (
ownname VARCHAR2,
indname VARCHAR2,
partname VARCHAR2 DEFAULT NULL,
stattab VARCHAR2 DEFAULT NULL,
statid VARCHAR2 DEFAULT NULL,
numrows NUMBER DEFAULT NULL,
numlblks NUMBER DEFAULT NULL,
numdist NUMBER DEFAULT NULL,
avglblk NUMBER DEFAULT NULL,
avgdblk NUMBER DEFAULT NULL,
clstfct NUMBER DEFAULT NULL,
indlevel NUMBER DEFAULT NULL,
flags NUMBER DEFAULT NULL,
statown VARCHAR2 DEFAULT NULL,
no_invalidate BOOLEAN DEFAULT to_no_invalidate_type(
get_param('NO_INVALIDATE')),
guessq NUMBER DEFAULT NULL,
cachedblk NUMBER DEFAULT NULL,
cachehit NUMBER DEFUALT NULL,
force BOOLEAN DEFAULT FALSE);

Use the following for user-defined statistics:

DBMS_STATS.SET_INDEX_STATS (
ownname VARCHAR2,
indname VARCHAR2,
partname VARCHAR2 DEFAULT NULL,
stattab VARCHAR2 DEFAULT NULL,
statid VARCHAR2 DEFAULT NULL,
ext_stats RAW,
stattypown VARCHAR2 DEFAULT NULL,
stattypname VARCHAR2 DEFAULT NULL,
statown VARCHAR2 DEFAULT NULL,
no_invalidate BOOLEAN DEFAULT to_no_invalidate_type(
get_param('NO_INVALIDATE')),
cachedblk NUMBER DEFAULT NULL,
cachehit NUMBER DEFUALT NULL,
force BOOLEAN DEFAULT FALSE);



 



Parameters



Table 142-90 SET_INDEX_STATS Procedure Parameters

Parameter

Description

​ownname​

Name of the schema

​indname​

Name of the index

​partname​

Name of the index partition in which to store the statistics. If the index is partitioned and if ​​partname​​​ is ​​NULL​​, then the statistics are stored at the global index level.

​stattab​

User statistics table identifier describing where to store the statistics. If ​​stattab​​​ is ​​NULL​​, then the statistics are stored directly in the dictionary.

​statid​

Identifier (optional) to associate with these statistics within ​​stattab​​​ (Only pertinent if ​​stattab​​​ is not ​​NULL​​)

​ext_stats​

User-defined statistics

​stattypown​

Schema of the statistics type

​stattypname​

Name of the statistics type

​numrows​

Number of rows in the index (partition)

​numlblks​

Number of leaf blocks in the index (partition)

​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). If not provided, then this value is derived from ​​numlblks​​​ and ​​numdist​​.

​avgdblk​

Average integral number of data blocks in the table pointed to by a distinct key for this index (partition). If not provided, then this value is derived from ​​clstfct​​​ and ​​numdist​​.

​clstfct​

See ​​clustering_factor​​​ column of the ​​all_indexes​​ view for a description

​indlevel​

Height of the index (partition)

​flags​

For internal Oracle use (should be left as ​​NULL​​)

​statown​

Schema containing ​​stattab​​​ (if different than ​​ownname​​)

​no_invalidate​

Does not invalidate the dependent cursors if set to ​​TRUE​​​. The procedure invalidates the dependent cursors immediately if set to ​​FALSE​​​. Use ​​DBMS_STATS​​​.​​AUTO_INVALIDATE​​​. to have Oracle decide when to invalidate dependent cursors. This is the default. The default can be changed using the ​​SET_DATABASE_PREFS Procedure​​​, ​​SET_GLOBAL_PREFS Procedure​​​, ​​SET_SCHEMA_PREFS Procedure​​​ and ​​SET_TABLE_PREFS Procedure​​.

​guessq​

Guess quality. See the ​​pct_direct_access​​​ column of the ​​all_indexes​​ view for a description.

​cachedblk​

The average number of blocks in the buffer cache for the segment (index/table/index partition/table partition)

​cachehit​

The average cache hit ratio for the segment (index/table/index partition/table partition)

​force​

Sets the values even if statistics of the index are locked



 



Usage Notes

  • To invoke this procedure you must be owner of the table, or you need the​​ANALYZE​​ ​​ANY​​ privilege. For objects owned by ​​SYS​​, you need to be either the owner of the table, or you need the ​​ANALYZE​​ ​​ANY​​ ​​DICTIONARY​​ privilege or the ​​SYSDBA​​ privilege.
  • The Optimizer uses the cached data to estimate number of cached blocks for index or statistics table access. The total cost of the operation will be combined from the I/O cost of reading not cached blocks from disk, the CPU cost of getting cached blocks from the buffer cache, and the CPU cost of processing the data.
  • Oracle maintains​​cachedblk​​ and ​​cachehit​​ at all times but uses correspondent caching statistics for optimization as part of the table and index statistics only when the user calls ​​DBMS_STATS.GATHER_[TABLE/INDEX/SCHEMA/DATABASE]_STATS​​ procedure for auto mode or ​​DBMS_STATS.GATHER_SYSTEM_STATS​​ for manual mode. In order to prevent the user from utilizing inaccurate and unreliable data, the optimizer will compute a 'confidence factor' for each ​​cachehit​​ and a ​​cachedblk​​ for each object. If the 'confidence factor' for the value meets confidence criteria, this value will be used, otherwise the defaults will be used.
  • The automatic maintenance algorithm for object caching statistics assumes that there is only one major workload for the system and adjusts statistics to this workload, ignoring other "minor" workloads. If this is not the case, you must use manual mode for maintaining object caching statistics.
  • The object caching statistics maintenance algorithm for auto mode prevents you from using statistics in the following situations
  • When not enough data has been analyzed, such as when an object has been recently create
  • When the system does not have one major workload resulting in averages not corresponding to real values.



 



Exceptions

​ORA-20000​​: Object does not exist or insufficient privileges

​ORA-20001​​: Invalid input value

​ORA-20005​​: Object statistics are locked



SET_TABLE_STATS Procedure

 

This procedure sets table-related information.

 



Syntax

DBMS_STATS.SET_TABLE_STATS (
ownname VARCHAR2,
tabname VARCHAR2,
partname VARCHAR2 DEFAULT NULL,
stattab VARCHAR2 DEFAULT NULL,
statid VARCHAR2 DEFAULT NULL,
numrows NUMBER DEFAULT NULL,
numblks NUMBER DEFAULT NULL,
avgrlen NUMBER DEFAULT NULL,
flags NUMBER DEFAULT NULL,
statown VARCHAR2 DEFAULT NULL,
no_invalidate BOOLEAN DEFAULT to_no_invalidate_type (
get_param('NO_INVALIDATE')),
cachedblk NUMBER DEFAULT NULL,
cachehit NUMBER DEFUALT NULL,
force BOOLEAN DEFAULT FALSE);



 



Parameters



Table 142-95 SET_TABLE_STATS Procedure Parameters

Parameter

Description

​ownname​

Name of the schema

​tabname​

Name of the table

​partname​

Name of the table partition in which to store the statistics. If the table is partitioned and ​​partname​​​ is ​​NULL​​, then the statistics are stored at the global table level.

​stattab​

User statistics table identifier describing where to store the statistics. If ​​stattab​​​ is ​​NULL​​, then the statistics are stored directly in the dictionary.

​statid​

Identifier (optional) to associate with these statistics within ​​stattab​​​ (Only pertinent if ​​stattab​​​ is not ​​NULL​​)

​numrows​

Number of rows in the table (partition)

​numblks​

Number of blocks the table (partition) occupies

​avgrlen​

Average row length for the table (partition)

​flags​

For internal Oracle use (should be left as ​​NULL​​)

​statown​

Schema containing ​​stattab​​​ (if different than ​​ownname​​)

​no_invalidate​

Does not invalidate the dependent cursors if set to ​​TRUE​​​. The procedure invalidates the dependent cursors immediately if set to ​​FALSE​​​. Use ​​DBMS_STATS​​​.​​AUTO_INVALIDATE​​​. to have Oracle decide when to invalidate dependent cursors. This is the default. The default can be changed using the ​​SET_DATABASE_PREFS Procedure​​​, ​​SET_GLOBAL_PREFS Procedure​​​, ​​SET_SCHEMA_PREFS Procedure​​​ and ​​SET_TABLE_PREFS Procedure​​.

​cachedblk​

The average number of blocks in the buffer cache for the segment (index/table/index partition/table partition)

​cachehit​

The average cache hit ratio for the segment (index/table/index partition/table partition)

​force​

Sets the values even if statistics of the table are locked



 



Usage Notes

  • To invoke this procedure you must be owner of the table, or you need the​​ANALYZE​​ ​​ANY​​ privilege. For objects owned by ​​SYS​​, you need to be either the owner of the table, or you need the ​​ANALYZE​​ ​​ANY​​ ​​DICTIONARY​​ privilege or the ​​SYSDBA​​ privilege.
  • The Optimizer uses the cached data to estimate number of cached blocks for index or statistics table access. The total cost of the operation will be combined from the I/O cost of reading not cached blocks from disk, the CPU cost of getting cached blocks from the buffer cache, and the CPU cost of processing the data.
  • Oracle maintains​​cachedblk​​ and ​​cachehit​​ at all times but uses correspondent caching statistics for optimization as part of the table and index statistics only when the user calls ​​DBMS_STATS.GATHER_[TABLE/INDEX/SCHEMA/DATABASE]_STATS​​ procedure for auto mode or ​​DBMS_STATS.GATHER_SYSTEM_STATS​​ for manual mode. In order to prevent the user from utilizing inaccurate and unreliable data, the optimizer will compute a 'confidence factor' for each ​​cachehit​​ and a ​​cachedblk​​ for each object. If the 'confidence factor' for the value meets confidence criteria, this value will be used, otherwise the defaults will be used.
  • The automatic maintenance algorithm for object caching statistics assumes that there is only one major workload for the system and adjusts statistics to this workload, ignoring other "minor" workloads. If this is not the case, you must use manual mode for maintaining object caching statistics.
  • The object caching statistics maintenance algorithm for auto mode prevents you from using statistics in the following situations
  • When not enough data has been analyzed, such as when an object has been recently create
  • When the system does not have one major workload resulting in averages not corresponding to real values.



 



Exceptions

​ORA-20000​​: Object does not exist or insufficient privileges

​ORA-20001​​: Invalid input value

​ORA-20005​​: Object statistics are locked



LOCK_TABLE_STATS Procedure

This procedure locks the statistics on the table.



Syntax

DBMS_STATS.LOCK_TABLE_STATS (
ownname VARCHAR2,
tabname VARCHAR2);



Parameters



Table 142-66 LOCK_TABLE_STATS Procedure Parameters

Parameter

Description

​ownname​

The name of the schema

​tabname​

The name of the table



Usage Notes

  • To invoke this procedure you must be owner of the table, or you need the​​ANALYZE​​ ​​ANY​​ privilege. For objects owned by ​​SYS​​, you need to be either the owner of the table, or you need the ​​ANALYZE​​ ​​ANY​​ ​​DICTIONARY​​ privilege or the ​​SYSDBA​​ privilege.
  • When statistics on a table are locked, all the statistics depending on the table, including table statistics, column statistics, histograms and statistics on all dependent indexes, are considered to be locked.
  • The​​SET_*,​​ ​​DELETE_*,​​ ​​IMPORT_*,​​ ​​GATHER_*​​ procedures that modify statistics in the dictionary of an individual table, index or column will raise an error if statistics of the object is locked.
  • Procedures that operates on multiple objects (such as​​GATHER_SCHEMA_STATS​​) will skip modifying the statistics of an object if it is locked. Many procedures have force argument to override the lock.
  • This procedure either freezes the current set of the statistics or keeps the statistics empty (uncollected) to use Dynamic Sampling.
  • The locked or unlocked state is not exported along with the table statistics when using​​EXPORT_*_STATS​​ procedures.



UNLOCK_TABLE_STATS Procedure

This procedure unlocks the statistics on the table.



Syntax

DBMS_STATS.UNLOCK_TABLE_STATS (
ownname VARCHAR2,
tabname VARCHAR2);



Parameters



Table 142-99 UNLOCK_TABLE_STATS Procedure Parameters

Parameter

Description

​ownname​

The name of the schema

​tabname​

The name of the table



Usage Notes

  • To invoke this procedure you must be owner of the table, or you need the​​ANALYZE​​ ​​ANY​​ privilege. For objects owned by ​​SYS​​, you need to be either the owner of the table, or you need the ​​ANALYZE​​ ​​ANY​​ ​​DICTIONARY​​ privilege or the ​​SYSDBA​​ privilege.
  • When statistics on a table is locked, all the statistics depending on the table, including table statistics, column statistics, histograms and statistics on all dependent indexes, are considered to be locked.
  • The​​SET_*,​​ ​​DELETE_*,​​ ​​IMPORT_*,​​ ​​GATHER_*​​ procedures that modify statistics in the dictionary of an individual table, index or column will raise an error if statistics of the object is locked.
  • Procedures that operates on multiple objects (such as​​GATHER_SCHEMA_STATS​​) will skip modifying the statistics of an object if it is locked. Many procedures have force argument to override the lock.



How to export and import table statistics between two databases.


Unlock the stats on the customer  table
exec dbms_stats.unlock_table_stats(ownname => scott, tabname => 'CUSTOMER');
Oracle will gather stats via the overnight or weekend job window
create table for Exports of customer table stats
execute dbms_stats.create_stat_table(ownname= 'scott', stattab= 'backup_stats_uat');
Import the stats from the customer table and indexes
exec dbms_stats.import_table_stats(ownname=>'scott', tabname=>'customer', statown=>'scott', stattab=>'backup_stats_uat', cascade=>true);
Use datapump to export the table
expdp system tables=scott.backup_stats_uat directory=oraexp dumpfile=backup_stats_uat.dmp logfile=backup_stats_uat.log
Transfer the file to the production system
unlock stats on table scott.customer
exec dbms_stats.unlock_table_stats(ownname => scott, tabname => 'customer')
Import the table backup_stats_uat using the backup_stats_uat.dmp
impdp system tables=scott.backup_stats_uat directory=data_pump_dir dumpfile=backup_stats_uat.dmp logfile=imp_backup_stats_uat.log
Once table is imported /import the table and index stats
exec dbms_stats.export_table_stats(ownname=>'scott', tabname=>'customer', stattab=>'backup_stats_uat', cascade=>true, statown=>'scott');
drop the backup_stats_uat table
execute dbms_stats.drop_stat_table(ownname= 'npp', stattab= 'backup_stats_uat');
If you need to regress the stats
exec dbms_stats.restore_table_stats ('scott','customer',sysdate-1);

– drop statistics table
SQL> execute dbms_stats.drop_stat_table(ownname= 'scott', stattab= 'backup_stats');
Tips:

Once lock index statistics, even rebuild index by rebuild clause ,wouldn't make the statistics invalid.

Truncate table partition wouldn't make  golbal index statistics and local index statistics invalid.

 

参考至:http://docs.oracle.com/cd/E11882_01/appdev.112/e40758/d_stats.htm#ARPLS68567

​​                http://www.dba-oracle.com/t_export_import_cbo_optimizer_statistics_dbms_stats.htm​​

​​                http://mdesouza.wordpress.com/2011/08/04/export-import-table-stats-from-uat-system-into-production/​​


举报

相关推荐

0 条评论