有时想对某些表收集统计信息
CREATE OR REPLACE PROCEDURE GATHER_STATS
ASDECLAREV_SQL1 VARCHAR(1000);--表游标CURSOR C1 ISSELECT (SELECT USER) AS TABLE_OWNER,TABLE_NAMEFROM USER_TABLES; --可以在这里加过滤条件--索引游标CURSOR C2 ISSELECT TABLE_OWNER,INDEX_NAMEFROM USER_INDEXESWHERE TABLE_OWNER IN (select USER);BEGIN--收集表统计信息FOR C IN C1LOOPV_SQL1 :='DBMS_STATS.GATHER_TABLE_STATS('''||C.TABLE_OWNER||''','''||C.TABLE_NAME||''',NULL,100,FALSE,''FOR ALL COLUMNS SIZE AUTO'',8,''AUTO'',FALSE);';EXECUTE IMMEDIATE V_SQL1;END LOOP;--收集索引统计信息FOR C IN C2LOOPV_SQL1 :='DBMS_STATS.GATHER_INDEX_STATS('''||C.TABLE_OWNER||''','''||C.INDEX_NAME||''',NULL,100,NULL,NULL,8);';EXECUTE IMMEDIATE V_SQL1;END LOOP;END;
/
执行方法:
表小就很快,表大就慢
看各用户占用空间
select username,round(user_used_space(username) * (select PARA_VALUE FROM v$dm_ini where para_name ='GLOBAL_PAGE_SIZE')/1024/1024) USED_MB FROM dba_users;
收集统计信息的速度是 1分钟1G。
观察进展
SELECT TOP 10 AO.OWNER, SO.NAME AS "OBJECT_NAME", MAX(ST.LAST_GATHERED) AS "LAST_ANALYZED" FROM SYSSTATS ST,SYSOBJECTS SO,ALL_OBJECTS AOWHERE ST.ID=AO.OBJECT_IDAND SO.ID=AO.OBJECT_ID--AND AO.OWNER=(select user)
GROUP BY AO.OWNER, SO.NAME
ORDER BY 3 DESC;
最新的排在最上面,一般是表和索引。