有时想对某些表收集统计信息
CREATE OR REPLACE PROCEDURE GATHER_STATS
AS
DECLARE
V_SQL1 VARCHAR(1000);
--表游标
CURSOR C1 IS
SELECT (SELECT USER) AS TABLE_OWNER,
TABLE_NAME
FROM USER_TABLES; --可以在这里加过滤条件
--索引游标
CURSOR C2 IS
SELECT TABLE_OWNER,
INDEX_NAME
FROM USER_INDEXES
WHERE TABLE_OWNER IN (select USER);
BEGIN
--收集表统计信息
FOR C IN C1
LOOP
V_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 C2
LOOP
V_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 AO
WHERE ST.ID=AO.OBJECT_ID
AND SO.ID=AO.OBJECT_ID
--AND AO.OWNER=(select user)
GROUP BY AO.OWNER, SO.NAME
ORDER BY 3 DESC;
最新的排在最上面,一般是表和索引。