共计 7146 个字符,预计需要花费 18 分钟才能阅读完成。
这篇文章主要为大家展示了“oracler 统计信息如何查看与收集”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让丸趣 TV 小编带领大家一起研究并学习一下“oracler 统计信息如何查看与收集”这篇文章吧。
查看某个表的统计信息
SQL alter session set NLS_DATE_FORMAT= YYYY-MM-DD HH24:MI:SS
Session altered.
SQL select t.TABLE_NAME,t.NUM_ROWS,t.BLOCKS,t.LAST_ANALYZED from user_tables t where table_name in (T1 , T2
TABLE_NAME NUM_ROWS BLOCKS LAST_ANALYZED
—————————— ———- ———- ——————-
T1 2000 30 2017-07-16 14:02:23
T2 2000 30 2017-07-16 14:02:23
查看某个表上索引的统计信息
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
TABLE_NAME INDEX_NAME BLEVEL NUM_ROWS LEAF_BLOCKS LAST_ANALYZED
————– ———————- ———- ———- ———– ——————-
T1 IDX_T1_OBJ_ID 1 2000 5 2017-07-16 12:06:33
T2 IDX_T2_OBJ_ID 1 2000 5 2017-07-16 14:02:23
T2 IDX_T2_OBJ_TYPE 1 2000 5 2017-07-16 14:02:23
T2 IDX_T2_OBJ_NAME 1 2000 8 2017-07-16 14:02:23
T2 IDX_T2_DATA_OBJ_ID 1 1198 3 2017-07-16 14:02:23
T2 IDX_T2_STATUS 1 2000 5 2017-07-16 14:02:23
T2 IDX_T2_CREATED 1 2000 6 2017-07-16 14:02:23
T2 IDX_T2_LAST_DDL_TIME 1 2000 6 2017-07-16 14:02:23
8 rows selected.
oracle 会在一个固定的时间将数据库里的表和索引的相关统计信息进行收集,默认选择周一到周五晚上 10 点,持续收集 4 小时,和周六周日早上 6 点,持续收集 20 小时。
oracle 可以专门对表的记录变化量进行管理,当某表一天记录变化量没有超过指定的阀值时,oracle 就不会对该表进行统计信息收集。
修改统计信息自动收集时间
SQL set linesize 200
SQL col REPEAT_INTERVAL for a60
SQL col DURATION for a30
SQL select t1.window_name,t1.repeat_interval,t1.duration from dba_scheduler_windows t1,dba_scheduler_wingroup_members t2
2 where t1.window_name=t2.window_name and t2.window_group_name in (MAINTENANCE_WINDOW_GROUP , BSLN_MAINTAIN_STATS_SCHED
WINDOW_NAME REPEAT_INTERVAL DURATION
—————— ———————————————————— —————
MONDAY_WINDOW freq=daily;byday=MON;byhour=22;byminute=0; bysecond=0 +000 04:00:00
TUESDAY_WINDOW freq=daily;byday=TUE;byhour=22;byminute=0; bysecond=0 +000 04:00:00
WEDNESDAY_WINDOW freq=daily;byday=WED;byhour=22;byminute=0; bysecond=0 +000 04:00:00
THURSDAY_WINDOW freq=daily;byday=THU;byhour=22;byminute=0; bysecond=0 +000 04:00:00
FRIDAY_WINDOW freq=daily;byday=FRI;byhour=22;byminute=0; bysecond=0 +000 04:00:00
SATURDAY_WINDOW freq=daily;byday=SAT;byhour=6;byminute=0; bysecond=0 +000 20:00:00
SUNDAY_WINDOW freq=daily;byday=SUN;byhour=6;byminute=0; bysecond=0 +000 20:00:00
7 rows selected.
关闭自动统计信息收集
BEGIN
DBMS_SCHEDULER.DISABLE(
name = SYS . SATURDAY_WINDOW ,
force = TRUE);
END;
/
修改自动统计信息持续时间
BEGIN
DBMS_SCHEDULER.SET_ATTRIBUTE(
name = SYS . SATURDAY_WINDOW ,
attribute = DURATION ,
value = numtodsinterval(240, minute
END;
/
修改自动统计信息开始时间
BEGIN
DBMS_SCHEDULER.SET_ATTRIBUTE(
name = SYS . SATURDAY_WINDOW ,
attribute = REPEAT_INTERVAL ,
value = freq=daily;byday=SAT;byhour=22;byminute=0; bysecond=0
END;
/
开启自动统计信息收集
BEGIN
DBMS_SCHEDULER.ENABLE(
name = SYS . SATURDAY_WINDOW
END;
/
SQL set linesize 200
SQL col REPEAT_INTERVAL for a60
SQL col DURATION for a30
SQL select t1.window_name,t1.repeat_interval,t1.duration from dba_scheduler_windows t1,dba_scheduler_wingroup_members t2
where t1.window_name=t2.window_name and t2.window_group_name in (MAINTENANCE_WINDOW_GROUP , BSLN_MAINTAIN_STATS_SCHED
WINDOW_NAME REPEAT_INTERVAL DURATION
—————– ———————————————————— ————–
MONDAY_WINDOW freq=daily;byday=MON;byhour=22;byminute=0; bysecond=0 +000 04:00:00
TUESDAY_WINDOW freq=daily;byday=TUE;byhour=22;byminute=0; bysecond=0 +000 04:00:00
WEDNESDAY_WINDOW freq=daily;byday=WED;byhour=22;byminute=0; bysecond=0 +000 04:00:00
THURSDAY_WINDOW freq=daily;byday=THU;byhour=22;byminute=0; bysecond=0 +000 04:00:00
FRIDAY_WINDOW freq=daily;byday=FRI;byhour=22;byminute=0; bysecond=0 +000 04:00:00
SATURDAY_WINDOW freq=daily;byday=SAT;byhour=22;byminute=0; bysecond=0 +000 04:00:00
SUNDAY_WINDOW freq=daily;byday=SUN;byhour=6;byminute=0; bysecond=0 +000 20:00:00
7 rows selected.
手动收集统计信息
收集表统计信息
exec dbms_stats.gather_table_stats(ownname = USER ,tabname = TEST ,estimate_percent = 10,method_opt= for all indexed columns
exec dbms_stats.gather_table_stats(ownname = USER ,tabname = TAB_NAME ,CASCADE= TURE);
收集分区表的某个分区统计信息
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);
收集索引统计信息
exec dbms_stats.gather_index_stats(ownname = USER ,indname = IDX_OBJECT_ID ,estimate_percent = 10 ,degree = 4
收集表和索引统计信息
exec dbms_stats.gather_table_stats(ownname = USER ,tabname = TEST ,estimate_percent = 10,method_opt= for all indexed columns ,cascade= TRUE);
收集某个用户的统计信息
exec dbms_stats.gather_schema_stats(ownname= CS ,estimate_percent= 10,degree= 8,cascade= true,granularity= ALL
收集整个数据库的统计信息
exec dbms_stats.gather_database_stats(estimate_percent= 10,degree= 8,cascade= true,granularity= ALL
ownname:USER_NAME
tabname:TABLE_NAME
partname: 分区表的某个分区名
estimate_percent: 采样百分比,有效范围为 [0.000001,100]
block_sample:使用随机块采样代替随机行采样
method_opt:
cascade: 是否收集此表索引的统计信息
degree: 并行处理的 cpu 数量
granularity:统计数据的收集,ALL – 收集所有(子分区,分区和全局)统计信息
动态采集统计信息
对于新创建的表,当访问此表时,oracle 会动态的收集这个表的相关信息,等到晚上 10 点,再将其收集到数据字典中。
SQL set autotrace off
SQL set linesize 1000
SQL drop table t_sample purge;
drop table t_sample purge
ERROR at line 1:
ORA-00942: table or view does not exist
SQL create table t_sample as select * from dba_objects;
Table created.
SQL create index idx_t_sample_objid on t_sample(object_id);
Index created.
新建的表,查不到统计信息
SQL select num_rows, blocks, last_analyzed from user_tables where table_name = T_SAMPLE
NUM_ROWS BLOCKS LAST_ANAL
———- ———- ———
查看执行计划:
SQL set autotrace traceonly
SQL set linesize 1000
SQL select * from t_sample where object_id=20;
Execution Plan
———————————————————-
Plan hash value: 1453182238
————————————————————————————————–
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
————————————————————————————————–
| 0 | SELECT STATEMENT | | 1 | 207 | 2 (0)| 00:00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID| T_SAMPLE | 1 | 207 | 2 (0)| 00:00:01 |
|* 2 | INDEX RANGE SCAN | IDX_T_SAMPLE_OBJID | 1 | | 1 (0)| 00:00:01 |
————————————————————————————————–
Predicate Information (identified by operation id):
—————————————————
2 – access(OBJECT_ID =20)
Note
—–
– dynamic sampling used for this statement (level=2)
Statistics
———————————————————-
24 recursive calls
0 db block gets
93 consistent gets
1 physical reads
0 redo size
1608 bytes sent via SQL*Net to client
523 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed
– dynamic sampling used for this statement (level=2) 表示动态采样,但是不记录数据字典,除非手动收集表的统计信息。
SQL select num_rows, blocks, last_analyzed from user_tables where table_name = T_SAMPLE
NUM_ROWS BLOCKS LAST_ANAL
———- ———- ———
SQL
以上是“oracler 统计信息如何查看与收集”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注丸趣 TV 行业资讯频道!