oracledbms_stats统计信息管理(三)

2015-03-04 17:07:26 · 作者: · 浏览: 110
示: 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');