oracle的统计信息的查看与收集

查看某个表的统计信息

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


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

[html]  view plain  copy
 
  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.   
  3. TABLE_NAME     INDEX_NAME                 BLEVEL   NUM_ROWS LEAF_BLOCKS LAST_ANALYZED  
  4. -------------- ---------------------- ---------- ---------- ----------- -------------------  
  5. T1             IDX_T1_OBJ_ID                   1       2000           5 2017-07-16 12:06:33  
  6. T2             IDX_T2_OBJ_ID                   1       2000           5 2017-07-16 14:02:23  
  7. T2             IDX_T2_OBJ_TYPE                 1       2000           5 2017-07-16 14:02:23  
  8. T2             IDX_T2_OBJ_NAME                 1       2000           8 2017-07-16 14:02:23  
  9. T2             IDX_T2_DATA_OBJ_ID              1       1198           3 2017-07-16 14:02:23  
  10. T2             IDX_T2_STATUS                   1       2000           5 2017-07-16 14:02:23  
  11. T2             IDX_T2_CREATED                  1       2000           6 2017-07-16 14:02:23  
  12. T2             IDX_T2_LAST_DDL_TIME            1       2000           6 2017-07-16 14:02:23  
  13.   
  14. 8 rows selected.  


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

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

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

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

手动收集统计信息

收集表统计信息

[html]  view plain  copy
 
  1. exec dbms_stats.gather_table_stats(ownname => 'USER',tabname => 'TEST',estimate_percent => 10,method_opt=> 'for all indexed columns');  
  2.   
  3. exec dbms_stats.gather_table_stats(ownname => 'USER',tabname => 'TAB_NAME',CASCADE=>TURE);  

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

[html]  view plain  copy
 
  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);  

收集索引统计信息

[html]  view plain  copy
 
  1. exec dbms_stats.gather_index_stats(ownname => 'USER',indname => 'IDX_OBJECT_ID',estimate_percent => '10',degree => '4');  

收集表和索引统计信息 

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

收集某个用户的统计信息

[html]  view plain  copy
 
  1. exec dbms_stats.gather_schema_stats(ownname=>'CS',estimate_percent=>10,degree=>8,cascade=>true,granularity=>'ALL');  

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

[html]  view plain  copy
 
  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

[html]  view plain  copy
 
  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点,再将其收集到数据字典中。

[html]  view plain  copy
 
  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.   
  9.   
  10. SQL> create table t_sample as select * from dba_objects;  
  11.   
  12. Table created.  
  13.   
  14. SQL> create index idx_t_sample_objid on t_sample(object_id);  
  15.   
  16. Index created.  

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

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


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

[html]  view plain  copy
 
    1. SQL> select num_rows, blocks, last_analyzed from user_tables where table_name = 'T_SAMPLE';  
    2.   
    3.   NUM_ROWS     BLOCKS LAST_ANAL  
    4. ---------- ---------- ---------  
    5.   
    6.   
    7. SQL>   

猜你喜欢

转载自www.cnblogs.com/youngerger/p/9013576.html