查看某个表的统计信息

  1. SQL> alter session set NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS';
  2. Session altered.
  3. SQL> select t.TABLE_NAME,t.NUM_ROWS,t.BLOCKS,t.LAST_ANALYZED from user_tables t where table_name in ('T1','T2');
  4. TABLE_NAME                       NUM_ROWS     BLOCKS LAST_ANALYZED
  5. ------------------------------ ---------- ---------- -------------------
  6. T1                                   2000         30 2017-07-16 14:02:23
  7. T2                                   2000         30 2017-07-16 14:02:23

查看某个表上索引的统计信息

  1. SQL> select table_name,index_name,t.blevel,t.num_rows,t.leaf_blocks,t.last_analyzed from user_indexes t where table_name in ('T1','T2');
  2. TABLE_NAME     INDEX_NAME                 BLEVEL   NUM_ROWS LEAF_BLOCKS LAST_ANALYZED
  3. -------------- ---------------------- ---------- ---------- ----------- -------------------
  4. T1             IDX_T1_OBJ_ID                   1       2000           5 2017-07-16 12:06:33
  5. T2             IDX_T2_OBJ_ID                   1       2000           5 2017-07-16 14:02:23
  6. T2             IDX_T2_OBJ_TYPE                 1       2000           5 2017-07-16 14:02:23
  7. T2             IDX_T2_OBJ_NAME                 1       2000           8 2017-07-16 14:02:23
  8. T2             IDX_T2_DATA_OBJ_ID              1       1198           3 2017-07-16 14:02:23
  9. T2             IDX_T2_STATUS                   1       2000           5 2017-07-16 14:02:23
  10. T2             IDX_T2_CREATED                  1       2000           6 2017-07-16 14:02:23
  11. T2             IDX_T2_LAST_DDL_TIME            1       2000           6 2017-07-16 14:02:23
  12. 8 rows selected.

oracle会在一个固定的时间将数据库里的表和索引的相关统计信息进行收集,默认选择周一到周五晚上10点,持续收集4小时,和周六周日早上6点,持续收集20小时。

oracle可以专门对表的记录变化量进行管理,当某表一天记录变化量没有超过指定的阀值时,oracle就不会对该表进行统计信息收集。

修改统计信息自动收集时间

  1. SQL> set linesize 200
  2. SQL> col REPEAT_INTERVAL for a60
  3. SQL> col DURATION for a30
  4. SQL> select t1.window_name,t1.repeat_interval,t1.duration from dba_scheduler_windows t1,dba_scheduler_wingroup_members t2
  5. 2  where t1.window_name=t2.window_name and t2.window_group_name in ('MAINTENANCE_WINDOW_GROUP','BSLN_MAINTAIN_STATS_SCHED');
  6. WINDOW_NAME        REPEAT_INTERVAL                                              DURATION
  7. ------------------ ------------------------------------------------------------ ---------------
  8. MONDAY_WINDOW      freq=daily;byday=MON;byhour=22;byminute=0; bysecond=0        +000 04:00:00
  9. TUESDAY_WINDOW     freq=daily;byday=TUE;byhour=22;byminute=0; bysecond=0        +000 04:00:00
  10. WEDNESDAY_WINDOW   freq=daily;byday=WED;byhour=22;byminute=0; bysecond=0        +000 04:00:00
  11. THURSDAY_WINDOW    freq=daily;byday=THU;byhour=22;byminute=0; bysecond=0        +000 04:00:00
  12. FRIDAY_WINDOW      freq=daily;byday=FRI;byhour=22;byminute=0; bysecond=0        +000 04:00:00
  13. SATURDAY_WINDOW    freq=daily;byday=SAT;byhour=6;byminute=0; bysecond=0         +000 20:00:00
  14. SUNDAY_WINDOW      freq=daily;byday=SUN;byhour=6;byminute=0; bysecond=0         +000 20:00:00
  15. 7 rows selected.
  16. 关闭自动统计信息收集
  17. BEGIN
  18. DBMS_SCHEDULER.DISABLE(
  19. name => '"SYS"."SATURDAY_WINDOW"',
  20. force => TRUE);
  21. END;
  22. /
  23. 修改自动统计信息持续时间
  24. BEGIN
  25. DBMS_SCHEDULER.SET_ATTRIBUTE(
  26. name => '"SYS"."SATURDAY_WINDOW"',
  27. attribute => 'DURATION',
  28. value => numtodsinterval(240,'minute'));
  29. END;
  30. /
  31. 修改自动统计信息开始时间
  32. BEGIN
  33. DBMS_SCHEDULER.SET_ATTRIBUTE(
  34. name => '"SYS"."SATURDAY_WINDOW"',
  35. attribute => 'REPEAT_INTERVAL',
  36. value => 'freq=daily;byday=SAT;byhour=22;byminute=0; bysecond=0 ');
  37. END;
  38. /
  39. 开启自动统计信息收集
  40. BEGIN
  41. DBMS_SCHEDULER.ENABLE(
  42. name => '"SYS"."SATURDAY_WINDOW"');
  43. END;
  44. /
  45. SQL> set linesize 200
  46. SQL> col REPEAT_INTERVAL for a60
  47. SQL> col DURATION for a30
  48. SQL> select t1.window_name,t1.repeat_interval,t1.duration from dba_scheduler_windows t1,dba_scheduler_wingroup_members t2
  49. 2  where t1.window_name=t2.window_name and t2.window_group_name in ('MAINTENANCE_WINDOW_GROUP','BSLN_MAINTAIN_STATS_SCHED');
  50. WINDOW_NAME       REPEAT_INTERVAL                                              DURATION
  51. ----------------- ------------------------------------------------------------ --------------
  52. MONDAY_WINDOW     freq=daily;byday=MON;byhour=22;byminute=0; bysecond=0        +000 04:00:00
  53. TUESDAY_WINDOW    freq=daily;byday=TUE;byhour=22;byminute=0; bysecond=0        +000 04:00:00
  54. WEDNESDAY_WINDOW  freq=daily;byday=WED;byhour=22;byminute=0; bysecond=0        +000 04:00:00
  55. THURSDAY_WINDOW   freq=daily;byday=THU;byhour=22;byminute=0; bysecond=0        +000 04:00:00
  56. FRIDAY_WINDOW     freq=daily;byday=FRI;byhour=22;byminute=0; bysecond=0        +000 04:00:00
  57. SATURDAY_WINDOW   freq=daily;byday=SAT;byhour=22;byminute=0; bysecond=0        +000 04:00:00
  58. SUNDAY_WINDOW     freq=daily;byday=SUN;byhour=6;byminute=0; bysecond=0         +000 20:00:00
  59. 7 rows selected.

手动收集统计信息

收集表统计信息

  1. exec dbms_stats.gather_table_stats(ownname => 'USER',tabname => 'TEST',estimate_percent => 10,method_opt=> 'for all indexed columns');
  2. exec dbms_stats.gather_table_stats(ownname => 'USER',tabname => 'TAB_NAME',CASCADE=>TURE);

收集分区表的某个分区统计信息

  1. exec dbms_stats.gather_table_stats(ownname => 'USER',tabname => 'RANGE_PART_TAB',partname => 'p_201312',estimate_percent => 10,method_opt=> 'for all indexed columns',cascade=>TRUE);

收集索引统计信息

  1. exec dbms_stats.gather_index_stats(ownname => 'USER',indname => 'IDX_OBJECT_ID',estimate_percent => '10',degree => '4');

收集表和索引统计信息

  1. exec dbms_stats.gather_table_stats(ownname => 'USER',tabname => 'TEST',estimate_percent => 10,method_opt=> 'for all indexed columns',cascade=>TRUE);

收集某个用户的统计信息

  1. exec dbms_stats.gather_schema_stats(ownname=>'CS',estimate_percent=>10,degree=>8,cascade=>true,granularity=>'ALL');

收集整个数据库的统计信息

  1. exec dbms_stats.gather_database_stats(estimate_percent=>10,degree=>8,cascade=>true,granularity=>'ALL');

关于dbms_stats中参数的解释,具体参考官方文档:

http://docs.oracle.com/cd/E11882_01/appdev.112/e40758/d_stats.htm#ARPLS68582

  1. ownname: USER_NAME
  2. tabname: TABLE_NAME
  3. partname: 分区表的某个分区名
  4. estimate_percent: 采样百分比,有效范围为[0.000001,100]
  5. block_sample:使用随机块采样代替随机行采样
  6. method_opt:
  7. cascade:是否收集此表索引的统计信息
  8. degree:并行处理的cpu数量
  9. granularity: 统计数据的收集,'ALL' - 收集所有(子分区,分区和全局)统计信息

动态采集统计信息

对于新创建的表,当访问此表时,oracle会动态的收集这个表的相关信息,等到晚上10点,再将其收集到数据字典中。

  1. SQL> set autotrace off
  2. SQL> set linesize 1000
  3. SQL> drop table t_sample purge;
  4. drop table t_sample purge
  5. *
  6. ERROR at line 1:
  7. ORA-00942: table or view does not exist
  8. SQL> create table t_sample as select * from dba_objects;
  9. Table created.
  10. SQL> create index idx_t_sample_objid on t_sample(object_id);
  11. Index created.

新建的表,查不到统计信息

  1. SQL> select num_rows, blocks, last_analyzed from user_tables where table_name = 'T_SAMPLE';
  2. NUM_ROWS     BLOCKS LAST_ANAL
  3. ---------- ---------- ---------
  1. SQL> set autotrace traceonly
  2. SQL> set linesize 1000
  3. SQL> select  * from t_sample where object_id=20;
  4. Execution Plan
  5. ----------------------------------------------------------
  6. Plan hash value: 1453182238
  7. --------------------------------------------------------------------------------------------------
  8. | Id  | Operation                   | Name               | Rows  | Bytes | Cost (%CPU)| Time     |
  9. --------------------------------------------------------------------------------------------------
  10. |   0 | SELECT STATEMENT            |                    |     1 |   207 |     2   (0)| 00:00:01 |
  11. |   1 |  TABLE ACCESS BY INDEX ROWID| T_SAMPLE           |     1 |   207 |     2   (0)| 00:00:01 |
  12. |*  2 |   INDEX RANGE SCAN          | IDX_T_SAMPLE_OBJID |     1 |       |     1   (0)| 00:00:01 |
  13. --------------------------------------------------------------------------------------------------
  14. Predicate Information (identified by operation id):
  15. ---------------------------------------------------
  16. 2 - access("OBJECT_ID"=20)
  17. Note
  18. -----
  19. - dynamic sampling used for this statement (level=2)
  20. Statistics
  21. ----------------------------------------------------------
  22. 24  recursive calls
  23. 0  db block gets
  24. 93  consistent gets
  25. 1  physical reads
  26. 0  redo size
  27. 1608  bytes sent via SQL*Net to client
  28. 523  bytes received via SQL*Net from client
  29. 2  SQL*Net roundtrips to/from client
  30. 0  sorts (memory)
  31. 0  sorts (disk)
  32. 1  rows processed

- dynamic sampling used for this statement (level=2) 表示动态采样,但是不记录数据字典,除非手动收集表的统计信息。

    1. SQL> select num_rows, blocks, last_analyzed from user_tables where table_name = 'T_SAMPLE';
    2. NUM_ROWS     BLOCKS LAST_ANAL
    3. ---------- ---------- ---------
    4. SQL>

oracle的统计信息的查看与收集的更多相关文章

  1. oracle学习----统计信息

    1.收集统计信息的方式 for all columns size skewonly BEGIN  DBMS_STATS.GATHER_TABLE_STATS(ownname          => ...

  2. Oracle 搜集统计信息

    常用的统计信息收集脚本: 非分区表: BEGIN   DBMS_STATS.GATHER_TABLE_STATS(ownname          => 'SCOTT',             ...

  3. Oracle备份统计信息

    Oracle可以通过DBMS_STATS.GET_TABLE_STATS 收集表的统计信息,一般的收集方法如下: DBMS_STATS.GATHER_TABLE_STATS(OWNNAME => ...

  4. Oracle自动统计信息的收集原理及实验

    [日期:2014-11-21]来源:Linux社区  作者:stevendbaguo[字体:大 中 小] 从Oracle Database 10g开始,Oracle在建库后就默认创建了一个名为GATH ...

  5. Oracle Statistic 统计信息 小结

    oraclestatisticstabledatabasesqldictionary   目录(?)[-] 直方图上列的信息说明 直方图类型说明   一.  Statistic 说明 Oracle 官 ...

  6. Oracle 11G统计信息自动收集及调整

    查询统计信息的收集所对应的task,以及当前状态 col CLIENT_NAME for a50col TASK_NAME for a20SELECT client_name, task_name, ...

  7. oracle自动统计信息

    在11g中,默认自动收集统计信息的时间为晚上10点(周一到周五,4个小时),早上6点(周六,周日,20个小时),   select a.window_name, a.repeat_interval,a ...

  8. oracle更新统计信息以及解锁统计信息

    begin dbms_stats.unlock_table_stats(ownname => 'DM_MPAY', tabname => 'PLAT_INFO');end; begin d ...

  9. Oracle 搜集统计信息的存储过程

    DECLARE CURSOR STALE_TABLE IS SELECT OWNER, SEGMENT_NAME, CASE WHEN SIZE_GB < 0.5 THEN 30 WHEN SI ...

随机推荐

  1. 第二百四十六节,Bootstrap弹出框和警告框插件

    Bootstrap弹出框和警告框插件 学习要点: 1.弹出框 2.警告框 本节课我们主要学习一下 Bootstrap 中的弹出框和警告框插件. 一.弹出框 弹出框即点击一个元素弹出一个包含标题和内容的 ...

  2. MyBatis 使用简单的 XML或注解用于配置和原始映射

    MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis .My ...

  3. 【SPOJ】8222. Substrings(后缀自动机)

    http://www.spoj.com/problems/NSUBSTR/ 题意:给一个字符串S,令F(x)表示S的所有长度为x的子串中,出现次数的最大值.求F(1)..F(Length(S)) 这题 ...

  4. 【BZOJ】1635: [Usaco2007 Jan]Tallest Cow 最高的牛(差分序列)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1635 差分序列是个好东西啊....很多地方都用了啊,,, 线性的进行区间操作orz 有题可知 h[a ...

  5. 【Openwrt】刷

    设定你的电脑ip 为192.168.1.100 网线一头连接lan口,另外一头连接电脑.WAN口不能插线. 按住路由器的qss 键,开启路由器的电,灯灭掉,等6秒左右灯会再次闪几下就松开,用googl ...

  6. 提高ASP.NET网站性能的方法

    http://www.360doc.com/content/14/0705/18/7662927_392224856.shtml   Asp.NET有许多秘密,当你了解了这些秘密后,可以使得你的ASP ...

  7. linux下源代码搭建php环境之mysql(一)

    如今已经大半夜了,五一劳动节挺无聊的. 折腾一下吧.实在是睡不着.于是乎在电脑上安装个虚拟机,然后呢,在虚拟机上搭建一个php环境. 首先我得安装MYSQL吧. 发现遇到的问题真多. .待我娓娓道来. ...

  8. ionic ngRepeat追加数据(加载更多,不需要重复渲染dom数据)

    1)模版循环在之前的随笔中已经说过,使用挺简单的 http://www.cnblogs.com/tujia/p/6078217.html 简单来说就是控制器输入一个数据变量,模版里用ng-repeat ...

  9. webpack——html-webpack-plugin

    一开始考虑到浏览器的缓存问题,所以给打包的文件都带了.[hash],但是,这之后,index.html文件中的引入并没有哈希值,所以,就用到了下面的信插件: html-webpack-plugin可以 ...

  10. DNS rebinging攻击方式

    一.什么是DNS rebinding? 在dns协议中,请求和响应完成一台机器对一个域名的查询,响应信息包含请求域名站点对应的IP地址.假设你向DNS服务器A请求域名youself.domain.co ...