Oracle里的统计信息

打印 上一主题 下一主题

主题 1003|帖子 1003|积分 3009

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
目次

一、什么是统计信息
二、oracle收集和检察统计信息的方法
1、使用analyze命令收集统计信息
2、使用dbms_stats包收集统计信息
3、analyze和dbms_stats的区别
4、检察统计信息


一、什么是统计信息

oracle数据库里的统计信息是如下的一组数据:他们存储在数据字典里,且从多个维度描述了oracle数据库数据对象的详细信息。
oracle数据库里的统计信息主要分为以下6种情况:
(1)表的统计信息。
(2)列的统计信息。
(3)索引的统计信息。
(4)体系统计信息。
(5)数据字典统计信息。
(6)内部对象统计信息。
二、oracle收集和检察统计信息的方法

oracle数据库收集统计信息一样平常有以下2种方法:
(1)analyze命令。
(2)dbms_stats包。
针对以上6种统计信息,此中“表的统计信息”,“索引统计信息”,“列统计信息”,“数据字典统计信息”使用analyze或dbms_stats包收集均可以,但是“体系统计信息”和“内部对象统计信息”必须要dbms_stats包来收集才可以。
1、使用analyze命令收集统计信息

从oralce7开始,analyze命令就用来收集表、索引和列的统计信息。从oracle10g开始,创建索引后oracle会自动为您收集目标索引统计信息。analyze命令收集统计信息不会抹掉之间analyze效果。
创建测试表:
SQL>create table t1 as select * from dba_objects;
SQL>create index idx_t1 on t1(object_id);
(1)analyze索引统计信息:
SQL>analyze index idx_t1 delete statistics;
(2)对表收集统计信息,而且以估算模式,采样比为15%:
SQL>analyze table t1 estimate statistics sample 15 percent for table;
(3)对表收集统计信息,以统计模式:
SQL>analyze table t1 compute statistics for table;
(4)对列收集统计信息,以盘算模式:
SQL>analyze table t1 compute statistics for columns object_name,object_id;
(5)以盘算模式对表和列同时收集统计信息:
SQL>analyze table t1 compute statistics for t1 for columns object_name,object_id;
(6)以盘算模式对索引收集统计信息:
SQL>analyze index idx_t1 compute statistics;
(7)删除表、表上的索引、表的全部列的统计信息:
SQL>analyze table t1 delete statistics;
(8)以盘算模式,同时收集表、表上的列、表上的索引的统计信息:
SQL>analyze table t1 compute statistics;
2、使用dbms_stats包收集统计信息

从oracle 8.1.5开始,dbms_stats包就被广泛用于统计信息的收集,用dbms_stats包收集统计信息也是oracle官方推荐的方式。在收集CBO所必要的统计信息方面,可以简朴的将dbms_stats包明白成是analyze命令的增强版。
DBMS_STATS包最常见的4个存储过程:
(1)dbms_stats.gather_table_stats:用于收集目标表,目标表上列及目标表上索引的统计信息。
(2)dbms_stats.gather_index_stats:用于收集指定索引的统计信息。
(3)dbms_stats.gather_schema_stats:用于收集schema下全部对象的统计信息。
(4)dbms_stats.gather_database_stats:用于收集全库统计对象的统计信息。
以下是dbms_stats包的详细用法:
(1)对表收集统计信息,而且以估算模式,采样比为15%:
SQL>exec dbms_stats.gather_table_stats(ownname=>'SCOTT',tabname=>'T1',estimate_percent=>15,method_opt=>'FOR TABLE',cascade=>FALSE);
注意:method_opt参数指定了FOR TABLE不是在全部版本oracle下都是好用的。
(2)对表收集统计信息,以盘算模式:
SQL>exec dbms_stats.gather_table_stats(ownname=>'SCOTT',tabname=>'T1',estimate_percent=>100,method_opt=>'FOR TABLE',cascade=>FALSE);

SQL>exec dbms_stats.gather_table_stats(ownname=>'SCOTT',tabname=>'T1',estimate_percent=>NULL,method_opt=>'FOR TABLE',cascade=>FALSE);
(3)对列收集统计信息,以盘算模式:
SQL>exec dbms_stats.gather_table_stats(ownname=>'SCOTT',tabname=>'T1',estimate_percent=>100,method_opt=>'FOR ALL CULUMNS SIZE 1 OBJECT_NAME OBJECT_ID',cascade=>FALSE);
注意:以上方法收集了列objec_name、object_id的统计信息,同时也会收集表的统计信息。
(4)以盘算模式对索引收集统计信息:
SQL>exec dbms_stats.gather_index_stats(ownname=>'SCOTT',indname=>'INDEX_T1',estimate_percent=>100);
(5)删除表、表上的索引、表的全部列的统计信息:
SQL>exec dbms_stats.delete_table_stats(ownname=>'SCOTT',tabname=>'T1');
(6)以盘算模式,同时收集表、表上的列、表上的索引的统计信息:
SQL>exec dbms_stats.gather_table_stats(ownname=>'SCOTT',tabname=>'T1',estimate_percent=>15 ,cascade=>TRUE);
3、analyze和dbms_stats的区别

(1)analyze命令不能精确的收集分区表的统计信息,而dbms_stats包缺可以。
(2)analyze命令不能以并行收集统计信息,而dbms_stats包缺可以。
SQL>exec dbms_stats.gather_table_stats(ownname=>'SCOTT',tabname=>'T1',estimate_percent=>100, cascade=>FALSE,degree=>4);
(3)dbms_stats包只能收集与CBO相关的统计信息,而与CBO无关的额外信息,好比行迁徙/行链接的数量(chain_cnt),校验表和索引的结构信息等,dbms_stats包就无能为力了,而analyze命令是可以用来分析和收集上述额外信息。好比:
SQL>analyze table XXX list chained rows into YYY; --用来分析和收集行迁徙/行链接的数量。
SQL>analyze index XXX validate structure; --用来分析索引结构。
4、检察统计信息

oracle里的统计信息存储在数据字典表中,可以通过脚原来查询对象的统计信息。
sosi.sh脚本如下(可以检察表、索引、列的统计信息):
  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
  289. set echo on
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

农妇山泉一亩田

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表