暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle STALE_STAS什么时候从否变为是

askTom 2018-02-07
650

问题描述

嗨,
我试图理解将DBA_TAB_STATISTICS中的列值STALE_STATS从否更改为是的触发器。
我复制了一个表,收集了统计信息,删除了35% 记录,并且统计信息不是陈旧的 = “是”。
我很感激你对这一点的洞察力;

--CHECKING COUNT OF ORIGINAL TABLE
SELECT COUNT(1) FROM ALL_OBJECTS --1051227

--CREATING A DUP
CREATE TABLE TMP.TMP_ALL_OBJECTS AS SELECT * FROM all_objects

--CHECKING THE DUP IS IDENTICAL
SELECT COUNT(1) FROM TMP.TMP_ALL_OBJECTS --1051227

--CHECKING FOR STALE_STATS IN NEW TABLE
SELECT STALE_STATS FROM DBA_TAB_STATISTICS WHERE TABLE_NAME = 'TMP_ALL_OBJECTS' --NULL

--GATHERING STATS
BEGIN
 dbms_stats.gather_table_stats('TMP','TMP_ALL_OBJECTS',cascade=>TRUE);
END;

--CHECKING FOR STALE_STATS AFTER STATS GATHERING
SELECT STALE_STATS FROM ALL_TAB_STATISTICS WHERE TABLE_NAME = 'TMP_ALL_OBJECTS' --NO

--DELETEING 35% OF RECORDS
DELETE FROM CIT_INFRA_REPOS.TMP_ALL_OBJECTS WHERE OWNER='FIXED_INCOME';
COMMIT;

SELECT COUNT(1) FROM CIT_INFRA_REPOS.TMP_ALL_OBJECTS --651677

--checking the threshold
SELECT DBMS_STATS.GET_PREFS('STALE_PERCENT', 'TMP', 'TMP_ALL_OBJECTS') STALE_PERCENT FROM DUAL; --10

--CHECKING STALE_STATS 
SELECT STALE_STATS FROM ALL_TAB_STATISTICS WHERE TABLE_NAME = 'TMP_ALL_OBJECTS' --NO


提前感谢

专家解答

你很亲密 :-)

我们不会 * 立即 * 更新过时,因为如果我们这样做了,每次有人运行DML语句时,我们都必须这样做。因此,我们在内存中跟踪它,并不时将其刷新到字典中。

或者 .... 你可以手动冲洗它

SQL> SELECT COUNT(1) FROM ALL_OBJECTS;

  COUNT(1)
----------
     73853

1 row selected.

SQL> CREATE TABLE TMP_ALL_OBJECTS AS SELECT * FROM all_objects;

Table created.

SQL> SELECT COUNT(1) FROM TMP_ALL_OBJECTS;

  COUNT(1)
----------
     73853

1 row selected.

SQL> SELECT STALE_STATS FROM DBA_TAB_STATISTICS WHERE TABLE_NAME = 'TMP_ALL_OBJECTS';

STA
---
NO

1 row selected.

SQL> exec dbms_stats.gather_table_stats('','TMP_ALL_OBJECTS',cascade=>TRUE);

PL/SQL procedure successfully completed.

SQL> SELECT STALE_STATS FROM ALL_TAB_STATISTICS WHERE TABLE_NAME = 'TMP_ALL_OBJECTS';

STA
---
NO

1 row selected.

SQL> DELETE FROM TMP_ALL_OBJECTS WHERE rownum <= 30000;

30000 rows deleted.

SQL> COMMIT;

Commit complete.

SQL> SELECT COUNT(1) FROM TMP_ALL_OBJECTS;

  COUNT(1)
----------
     43853

1 row selected.

SQL> SELECT DBMS_STATS.GET_PREFS('STALE_PERCENT', user, 'TMP_ALL_OBJECTS') STALE_PERCENT FROM DUAL;

STALE_PERCENT
----------------------------------------------------------------------------------------------------------------------------------
10

1 row selected.

SQL> SELECT STALE_STATS FROM ALL_TAB_STATISTICS WHERE TABLE_NAME = 'TMP_ALL_OBJECTS';

STA
---
NO

1 row selected.

SQL> exec dbms_stats.flush_database_monitoring_info;

PL/SQL procedure successfully completed.

SQL> SELECT STALE_STATS FROM ALL_TAB_STATISTICS WHERE TABLE_NAME = 'TMP_ALL_OBJECTS';

STA
---
YES

1 row selected.

SQL>
SQL>


「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论