oracledbms_stats统计信息管理(三)
示:
select count(*) from t1;
COUNT(*)
----------
990000
--收集统计信息
EXEC DBMS_STATS.GATHER_TABLE_STATS('SCOTT', 'T1');
--查看数据字典中相关的统计信息
ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';
SELECT TABLE_NAME, NUM_ROWS, BLOCKS, LAST_ANALYZED
FROM USER_TABLES
WHERE TABLE_NAME = 'T1';
TABLE_NAME
--------------------------------------------------------------------------------
NUM_ROWS BLOCKS LAST_ANALYZED
---------- ---------- -------------------
T1
990000 9205 2015-02-28 17:16:51
这时默认的情况,如果修改全局设置,使得PENDING方式生效:
--设置阻止数据库自动发布统计信息
EXEC DBMS_STATS.SET_TABLE_PREFS('SCOTT', 'T1', 'PUBLISH', 'FALSE');
delete from t1 where rownum<=500000;
commit;
select count(*) from t1;
COUNT(*)
----------
490000
--收集统计信息
EXEC DBMS_STATS.GATHER_TABLE_STATS('SCOTT', 'T1');
--
--查看数据字典中相关的统计信息
SELECT TABLE_NAME, NUM_ROWS, BLOCKS, LAST_ANALYZED
FROM USER_TABLES
WHERE TABLE_NAME = 'T1';
TABLE_NAME
--------------------------------------------------------------------------------
NUM_ROWS BLOCKS LAST_ANALYZED
---------- ---------- -------------------
T1
990000 9205 2015-02-28 17:16:51
新收集的统计信息并没有覆盖数据字典中原始的统计信息,这是因为表T的全局属性被修改,
此时收集的统计信息并不会马上发布,而是至于PENDING状态.
--告诉优化器使用新收集的待定统计信息
alter session set optimizer_use_pending_statistics=true;
--对新的统计信息做一些需要的执行计划测试,看看是否满足需求
--发布新的统计信息
EXEC DBMS_STATS.PUBLISH_PENDING_STATS('SCOTT', 'T1');
--再次查看数据字典中相关的统计信息
SELECT TABLE_NAME, NUM_ROWS, BLOCKS, LAST_ANALYZED
FROM USER_TABLES
WHERE TABLE_NAME = 'T1';
TABLE_NAME
--------------------------------------------------------------------------------
NUM_ROWS BLOCKS LAST_ANALYZED
---------- ---------- -------------------
T1
490000 9205 2015-02-28 17:20:14 --已经是新的统计信息
--删除新的统计信息
EXEC DBMS_STATS.delete_pending_stats('SCOTT','DEPT');