Oracle 11g如何修改表级别的自动收集统计信息比率

58次阅读
没有评论

共计 3089 个字符,预计需要花费 8 分钟才能阅读完成。

丸趣 TV 小编给大家分享一下 Oracle 11g 如何修改表级别的自动收集统计信息比率,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

在 11g 之前,当表的数据量修改超过总数据量的 10%,就会晚上自动收集统计信息。
这个 STALE_PERCENT=10%,是无法修改的,如果表非常大,10% 是非常多的数据,非常有可能造成统计信息不准确。
统计信息收集窗口时间:
11g 的是 周一到周五 22:00-2:00 周六周日 6:00-2:00

SELECT w.window_name, w.repeat_interval, w.duration, w.enabled
FROM dba_autotask_window_clients c, dba_scheduler_windows w
WHERE c.window_name = w.window_name
AND c.optimizer_stats = ENABLED

WINDOW_NAME          REPEAT_INTERVAL                                              DURATION
——————– ———————————————————— —————
SUNDAY_WINDOW        freq=daily;byday=SUN;byhour=6;byminute=0; bysecond=0        +000 20:00:00
FRIDAY_WINDOW        freq=daily;byday=FRI;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
SATURDAY_WINDOW      freq=daily;byday=SAT;byhour=6;byminute=0; bysecond=0        +000 20:00:00
THURSDAY_WINDOW      freq=daily;byday=THU;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
MONDAY_WINDOW        freq=daily;byday=MON;byhour=22;byminute=0; bysecond=0        +000 04:00:00

在 11g 之后,STALE_PERCENT=10% 是可以修改的,分为全局(DBMS_STATS.SET_GLOBAL_PREFS)和表级别(DBMS_STATS.SET_TABLE_PREFS)。表级别的设定:

    修改为 5%(范围从 1 -100): exec dbms_stats.set_table_prefs(null, table_name , STALE_PERCENT ,5);
    恢复为 10%: exec dbms_stats.set_table_prefs(null, table_name , STALE_PERCENT ,null);
    查询百分比:select dbms_stats.get_prefs(STALE_PERCENT ,null, table_name) from dual; 

查询表的当前统计信息收集比率:
SQL select dbms_stats.get_prefs(STALE_PERCENT ,null, S) from dual;

DBMS_STATS.GET_PREFS(STALE_PERCENT ,NULL, S)
——————————————————————————–
10

SQL select to_char(LAST_ANALYZED, yyyy-mm-dd hh34:mi:ss) from DBA_TAB_STATISTICS where OWNER = ENTER and TABLE_NAME = S

TO_CHAR(LAST_ANALYZ
——————-
2017-09-10 00:26:10

SQL select * from dba_tab_modifications where table_name= S and TABLE_OWNER= ENTER

TABLE_OWNER                    TABLE_NAME
—————————— ——————————
PARTITION_NAME                 SUBPARTITION_NAME                 INSERTS
—————————— —————————— ———-
   UPDATES    DELETES TIMESTAMP TRU DROP_SEGMENTS
———- ———- ——— — ————-
ENTERPRISE                     S
                                                                  360773
    280456          0 03-OCT-17 NO              0

SQL SELECT s.table_name,s.num_rows,s.last_analyzed FROM dba_tables s where s.owner= ENTER and  s.table_name= S

TABLE_NAME                       NUM_ROWS LAST_ANAL
—————————— ———- ———
S                              29907073 10-SEP-17

可以看到 S 表有 29907073 行数据, INSERT 360773 行,UPDATE 280456 行数据,因为表的数据量大,10% 是非常多的数据,非常有可能造成统计信息不准确。
于是修改为 1%。

进入指定用户下进行修改:
SQL conn ENTER/XXX;
Connected.
SQL exec dbms_stats.set_table_prefs(null, S , STALE_PERCENT ,1);

PL/SQL procedure successfully completed.

SQL select dbms_stats.get_prefs(STALE_PERCENT ,null, S) from dual; 

DBMS_STATS.GET_PREFS(STALE_PERCENT ,NULL, S)
——————————————————————————–
1

S 表的统计信息收集比率改成了 1%。

以上是“Oracle 11g 如何修改表级别的自动收集统计信息比率”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注丸趣 TV 行业资讯频道!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-07-24发表,共计3089字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)