[统计信息]1.Oracle统计信息概述

Posted 满格

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[统计信息]1.Oracle统计信息概述相关的知识,希望对你有一定的参考价值。

image

 

(一)统计信息分类

Oracle的统计信息可以分为如下6类:

统计信息分类 作用
表的统计信息 包含记录数、表块的数量、平均行长度等
索引的统计信息 包含索引的高度、叶子块的数量、聚簇因子等
列的统计信息 包含列的distinct值、列的null值的数量、列的最小值、列的最大值以及直方图等
系统统计信息

系统统计信息用于描述Oracle所在服务器的系统处理能力,它包含了CPU和I/O两个维度,借助于系统统计信息,Oracle可以更清楚的指导服务器的实际处理能力

数据字典统计信息 数据字典统计信息用于描述数据库字典基表(如tab$,ind$等)、基表的索引、以及对应列的详细信息
内部对象统计信息 内部对象统计信息用于描述Oracle的一些内部表(如x$系列表)的详细信息,他的维度和普通表的统计信息维度类似,只不过其表块的数量为0,因为x$系列表实际上是Oracle自定义的内存结构,并不占用实际空间

 

(二)统计信息收集与删除

(1)使用analyze来收集/删除统计信息

--收集索引的统计信息
analyze index pk_id compute statistics;

-- 删除索引pk_id的统计信息
analyze index pk_id delete statistics;

-- 只对表收集统计信息,不对列和索引收集,以采样20%的方式收集
analyze table test01 estimate statistics sample 20 percent for table;

-- 收集test01的col1和col2的统计信息
analyze table test01 compute statistics for columns col1,col2;

-- 一次性收集test01 表、列、索引的统计信息
analyze table test01 compute statistics;

-- 删除test01 表、列、索引的统计信息
analyze table test01 delete statistics;

 

(2)使用DBMS_STATS来收集/删除统计信息

收集统计信息:

  • GATHER_TABLE_STATS:用来收集目标表、表上的列、表上的索引的统计信息;
  • GATHER_INDEX_STATS:用于收集索引的统计信息;
  • GATHER_SCHEMA_STATS:用于收集schema下所有对象的统计信息
  • GATHER_DATABASE_STATS:用于收集全库的统计信息

删除统计信息:

  • DELETE_COLUMN_STATS : 删除列的统计信息
  • DELETE_INDEX_STATS : 删除索引的统计信息
  • DELETE_TABLE_STATS :删除表的统计信息
  • DELETE_SCHEMA_STATS :删除schema的统计信息
  • DELETE_DATABASE_STATS :删除数据库的统计信息

 

(三)统计信息收集方法比较

  • analyze不能正确收集分区表的统计信息。analyze只会收集最底层对象的统计信息,然后推导和汇总出高一级的统计信息。例如对于分区表,analyze会统计出分区的统计信息,然后汇总出表的统计信息,对于表的行数,可以由分区汇总得到,但是对于列的distinct值,无法得到正确值。
  • analyze命令不能并行收集统计信息,而dbms_stats可以。
  • analyze命令可以收集行迁移/行链接、索引的结构等信息,而dbms_stats不行。

 

(四)查看统计信息

可以使用sosi.txt脚本收集统计信息,该脚本记录了表、分区、子分区级别的统计信息,sosi.txt脚本如下:

  1 set echo off
  2 set scan on
  3 set lines 150
  4 set pages 66
  5 set verify off
  6 set feedback off
  7 set termout off
  8 column uservar new_value Table_Owner noprint
  9 select user uservar from dual;
 10 set termout on
 11 column TABLE_NAME heading "Tables owned by &Table_Owner" format a30
 12 select table_name from dba_tables where owner=upper(\'&Table_Owner\') order by 1
 13 /
 14 undefine table_name
 15 undefine owner
 16 prompt
 17 accept owner prompt \'Please enter Name of Table Owner (Null = &Table_Owner): \'
 18 accept table_name  prompt \'Please enter Table Name to show Statistics for: \'
 19 column TABLE_NAME heading "Table|Name" format a15
 20 column PARTITION_NAME heading "Partition|Name" format a15
 21 column SUBPARTITION_NAME heading "SubPartition|Name" format a15
 22 column NUM_ROWS heading "Number|of Rows" format 9,999,999,990
 23 column BLOCKS heading "Blocks" format 999,990
 24 column EMPTY_BLOCKS heading "Empty|Blocks" format 999,999,990
 25 column AVG_SPACE heading "Average|Space" format 9,990
 26 column CHAIN_CNT heading "Chain|Count" format 999,990
 27 column AVG_ROW_LEN heading "Average|Row Len" format 990
 28 column COLUMN_NAME  heading "Column|Name" format a25
 29 column NULLABLE heading Null|able format a4
 30 column NUM_DISTINCT heading "Distinct|Values" format 999,999,990
 31 column NUM_NULLS heading "Number|Nulls" format 9,999,990
 32 column NUM_BUCKETS heading "Number|Buckets" format 990
 33 column DENSITY heading "Density" format 990
 34 column INDEX_NAME heading "Index|Name" format a15
 35 column UNIQUENESS heading "Unique" format a9
 36 column BLEV heading "B|Tree|Level" format 90
 37 column LEAF_BLOCKS heading "Leaf|Blks" format 990
 38 column DISTINCT_KEYS heading "Distinct|Keys" format 9,999,999,990
 39 column AVG_LEAF_BLOCKS_PER_KEY heading "Average|Leaf Blocks|Per Key" format 99,990
 40 column AVG_DATA_BLOCKS_PER_KEY heading "Average|Data Blocks|Per Key" format 99,990
 41 column CLUSTERING_FACTOR heading "Cluster|Factor" format 999,999,990
 42 column COLUMN_POSITION heading "Col|Pos" format 990
 43 column col heading "Column|Details" format a24
 44 column COLUMN_LENGTH heading "Col|Len" format 9,990
 45 column GLOBAL_STATS heading "Global|Stats" format a6
 46 column USER_STATS heading "User|Stats" format a6
 47 column SAMPLE_SIZE heading "Sample|Size" format 9,999,999,990
 48 column to_char(t.last_analyzed,\'MM-DD-YYYY\') heading "Date|MM-DD-YYYY" format a10
 49 prompt
 50 prompt ***********
 51 prompt Table Level
 52 prompt ***********
 53 prompt
 54 select 
 55     TABLE_NAME,
 56     NUM_ROWS,
 57     BLOCKS,
 58     EMPTY_BLOCKS,
 59     AVG_SPACE,
 60     CHAIN_CNT,
 61     AVG_ROW_LEN,
 62     GLOBAL_STATS,
 63     USER_STATS,
 64     SAMPLE_SIZE,
 65     to_char(t.last_analyzed,\'MM-DD-YYYY\')
 66 from dba_tables t
 67 where 
 68     owner = upper(nvl(\'&&Owner\',user))
 69 and table_name = upper(\'&&Table_name\')
 70 /
 71 select
 72     COLUMN_NAME,
 73     decode(t.DATA_TYPE,
 74            \'NUMBER\',t.DATA_TYPE||\'(\'||
 75            decode(t.DATA_PRECISION,
 76                   null,t.DATA_LENGTH||\')\',
 77                   t.DATA_PRECISION||\',\'||t.DATA_SCALE||\')\'),
 78                   \'DATE\',t.DATA_TYPE,
 79                   \'LONG\',t.DATA_TYPE,
 80                   \'LONG RAW\',t.DATA_TYPE,
 81                   \'ROWID\',t.DATA_TYPE,
 82                   \'MLSLABEL\',t.DATA_TYPE,
 83                   t.DATA_TYPE||\'(\'||t.DATA_LENGTH||\')\') ||\' \'||
 84     decode(t.nullable,
 85               \'N\',\'NOT NULL\',
 86               \'n\',\'NOT NULL\',
 87               NULL) col,
 88     NUM_DISTINCT,
 89     DENSITY,
 90     NUM_BUCKETS,
 91     NUM_NULLS,
 92     GLOBAL_STATS,
 93     USER_STATS,
 94     SAMPLE_SIZE,
 95     to_char(t.last_analyzed,\'MM-DD-YYYY\')
 96 from dba_tab_columns t
 97 where 
 98     table_name = upper(\'&Table_name\')
 99 and owner = upper(nvl(\'&Owner\',user))
100 /
101 select 
102     INDEX_NAME,
103     UNIQUENESS,
104     BLEVEL BLev,
105     LEAF_BLOCKS,
106     DISTINCT_KEYS,
107     NUM_ROWS,
108     AVG_LEAF_BLOCKS_PER_KEY,
109     AVG_DATA_BLOCKS_PER_KEY,
110     CLUSTERING_FACTOR,
111     GLOBAL_STATS,
112     USER_STATS,
113     SAMPLE_SIZE,
114     to_char(t.last_analyzed,\'MM-DD-YYYY\')
115 from 
116     dba_indexes t
117 where 
118     table_name = upper(\'&Table_name\')
119 and table_owner = upper(nvl(\'&Owner\',user))
120 /
121 break on index_name
122 select
123     i.INDEX_NAME,
124     i.COLUMN_NAME,
125     i.COLUMN_POSITION,
126     decode(t.DATA_TYPE,
127            \'NUMBER\',t.DATA_TYPE||\'(\'||
128            decode(t.DATA_PRECISION,
129                   null,t.DATA_LENGTH||\')\',
130                   t.DATA_PRECISION||\',\'||t.DATA_SCALE||\')\'),
131                   \'DATE\',t.DATA_TYPE,
132                   \'LONG\',t.DATA_TYPE,
133                   \'LONG RAW\',t.DATA_TYPE,
134                   \'ROWID\',t.DATA_TYPE,
135                   \'MLSLABEL\',t.DATA_TYPE,
136                   t.DATA_TYPE||\'(\'||t.DATA_LENGTH||\')\') ||\' \'||
137            decode(t.nullable,
138                   \'N\',\'NOT NULL\',
139                   \'n\',\'NOT NULL\',
140                   NULL) col
141 from 
142     dba_ind_columns i,
143     dba_tab_columns t
144 where 
145     i.table_name = upper(\'&Table_name\')
146 and owner = upper(nvl(\'&Owner\',user))
147 and i.table_name = t.table_name
148 and i.column_name = t.column_name
149 order by index_name,column_position
150 /
151 prompt
152 prompt ***************
153 prompt Partition Level
154 prompt ***************
155 select
156     PARTITION_NAME,
157     NUM_ROWS,
158     BLOCKS,
159     EMPTY_BLOCKS,
160     AVG_SPACE,
161     CHAIN_CNT,
162     AVG_ROW_LEN,
163     GLOBAL_STATS,
164     USER_STATS,
165     SAMPLE_SIZE,
166     to_char(t.last_analyzed,\'MM-DD-YYYY\')
167 from 
168     dba_tab_partitions t
169 where 
170     table_owner = upper(nvl(\'&&Owner\',user))
171 and table_name = upper(\'&&Table_name\')
172 order by partition_position
173 /
174 break on partition_name
175 select
176     PARTITION_NAME,
177     COLUMN_NAME,
178     NUM_DISTINCT,
179     DENSITY,
180     NUM_BUCKETS,
181     NUM_NULLS,
182     GLOBAL_STATS,
183     USER_STATS,
184     SAMPLE_SIZE,
185     to_char(t.last_analyzed,\'MM-DD-YYYY\')
186 from 
187     dba_PART_COL_STATISTICS t
188 where 
189     table_name = upper(\'&Table_name\')
190 and owner = upper(nvl(\'&Owner\',user))
191 /
192 break on partition_name
193 select 
194     t.INDEX_NAME,
195     t.PARTITION_NAME,
196     t.BLEVEL BLev,
197     t.LEAF_BLOCKS,
198     t.DISTINCT_KEYS,
199     t.NUM_ROWS,
200     t.AVG_LEAF_BLOCKS_PER_KEY,
201     t.AVG_DATA_BLOCKS_PER_KEY,
202     t.CLUSTERING_FACTOR,
203     t.GLOBAL_STATS,
204     t.USER_STATS,
205     t.SAMPLE_SIZE,
206     to_char(t.last_analyzed,\'MM-DD-YYYY\')
207 from 
208     dba_ind_partitions t, 
209     dba_indexes i
210 where 
211     i.table_name = upper(\'&Table_name\')
212 and i.table_owner = upper(nvl(\'&Owner\',user))
213 and i.owner = t.index_owner
214 and i.index_name=t.index_name
215 /
216 prompt
217 prompt ***************
218 prompt SubPartition Level
219 prompt ***************
220 select 
221     PARTITION_NAME,
222     SUBPARTITION_NAME,
223     NUM_ROWS,
224     BLOCKS,
225     EMPTY_BLOCKS,
226     AVG_SPACE,
227     CHAIN_CNT,
228     AVG_ROW_LEN,
229     GLOBAL_STATS,
230     USER_STATS,
231     SAMPLE_SIZE,
232     to_char(t.last_analyzed,\'MM-DD-YYYY\')
233 from 
234     dba_tab_subpartitions t
235 where 
236     table_owner = upper(nvl(\'&&Owner\',user))
237 and table_name = upper(\'&&Table_name\')
238 order by SUBPARTITION_POSITION
239 /
240 break on partition_name
241 select 
242     p.PARTITION_NAME,
243     t.SUBPARTITION_NAME,
244     t.COLUMN_NAME,
245     t.NUM_DISTINCT,
246     t.DENSITY,
247     t.NUM_BUCKETS,
248     t.NUM_NULLS,
249     t.GLOBAL_STATS,
250     t.USER_STATS,
251     t.SAMPLE_SIZE,
252     to_char(t.last_analyzed,\'MM-DD-YYYY\')
253 from 
254     dba_SUBPART_COL_STATISTICS t, 
255     dba_tab_subpartitions p
256 where 
257     t.table_name = upper(\'&Table_name\')
258 and t.owner = upper(nvl(\'&Owner\',user))
259 and t.subpartition_name = p.subpartition_name
260 and t.owner = p.table_owner
261 and t.table_name=p.table_name
262 /
263 break on partition_name
264 select 
265     t.INDEX_NAME,
266     t.PARTITION_NAME,
267     t.SUBPARTITION_NAME,
268     t.BLEVEL BLev,
269     t.LEAF_BLOCKS,
270     t.DISTINCT_KEYS,
271     t.NUM_ROWS,
272     t.AVG_LEAF_BLOCKS_PER_KEY,
273     t.AVG_DATA_BLOCKS_PER_KEY,
274     t.CLUSTERING_FACTOR,
275     t.GLOBAL_STATS,
276     t.USER_STATS,
277     t.SAMPLE_SIZE,
278     to_char(t.last_analyzed,\'MM-DD-YYYY\')
279 from 
280     dba_ind_subpartitions t, 
281     dba_indexes i
282 where 
283     i.table_name = upper(\'&Table_name\')
284 and i.table_owner = upper(nvl(\'&Owner\',user))
285 and i.owner = t.index_owner
286 and i.index_name=t.index_name
287 /
288 clear breaks
Oracle 和 SQLSERVER 重新获取统计信息的方法

并行和并发收集统计信息

[统计信息系列7] Oracle 11g的自动统计信息收集

[统计信息系列7] Oracle 11g的自动统计信息收集

Oracle 10g收集数据库统计信息

VIM - 字数统计