问题描述
嗨,
我试图理解将DBA_TAB_STATISTICS中的列值STALE_STATS从否更改为是的触发器。
我复制了一个表,收集了统计信息,删除了35% 记录,并且统计信息不是陈旧的 = “是”。
我很感激你对这一点的洞察力;
提前感谢
我试图理解将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语句时,我们都必须这样做。因此,我们在内存中跟踪它,并不时将其刷新到字典中。
或者 .... 你可以手动冲洗它
我们不会 * 立即 * 更新过时,因为如果我们这样做了,每次有人运行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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




