oracle

失効している統計情報のみを取得しなおす(分割実行)

SCOTTスキーマが持つテーブルの中で現在失効している統計情報を取得しなおすプロシージャです。無名ブロックで記載しているのでDBへのストアドは不要でお気軽です。fetch first xxx rows only の部分を適当に変えて使ってください。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
declare
exesql varchar2(800);
exeobj varchar2(80);
BEGIN
FOR CUR IN (select t.OWNER,t.TABLE_NAME from DBA_TAB_STATISTICS t where t.OWNER='SCOTT' and t.STALE_STATS ='YES' fetch first 100 rows only ) LOOP
exesql := 'begin DBMS_STATS.GATHER_TABLE_STATS( OWNNAME => ''"'|| CUR.OWNER||'"'',TABNAME => ''"'||CUR.TABLE_NAME||'"'',METHOD_OPT => ''FOR ALL COLUMNS SIZE AUTO''); end;';
exeobj := CUR.OWNER||'.'||CUR.TABLE_NAME;
EXECUTE IMMEDIATE exesql;
DBMS_OUTPUT.PUT_LINE(exeobj);
END LOOP;
END;
declare exesql varchar2(800); exeobj varchar2(80); BEGIN FOR CUR IN (select t.OWNER,t.TABLE_NAME from DBA_TAB_STATISTICS t where t.OWNER='SCOTT' and t.STALE_STATS ='YES' fetch first 100 rows only ) LOOP exesql := 'begin DBMS_STATS.GATHER_TABLE_STATS( OWNNAME => ''"'|| CUR.OWNER||'"'',TABNAME => ''"'||CUR.TABLE_NAME||'"'',METHOD_OPT => ''FOR ALL COLUMNS SIZE AUTO''); end;'; exeobj := CUR.OWNER||'.'||CUR.TABLE_NAME; EXECUTE IMMEDIATE exesql; DBMS_OUTPUT.PUT_LINE(exeobj); END LOOP; END;
declare
exesql varchar2(800);
exeobj varchar2(80);

BEGIN
FOR CUR IN (select t.OWNER,t.TABLE_NAME from DBA_TAB_STATISTICS  t where t.OWNER='SCOTT' and t.STALE_STATS ='YES' fetch first 100 rows only ) LOOP
exesql := 'begin DBMS_STATS.GATHER_TABLE_STATS( OWNNAME => ''"'|| CUR.OWNER||'"'',TABNAME => ''"'||CUR.TABLE_NAME||'"'',METHOD_OPT => ''FOR ALL COLUMNS SIZE AUTO''); end;';
exeobj := CUR.OWNER||'.'||CUR.TABLE_NAME;
EXECUTE IMMEDIATE exesql;
DBMS_OUTPUT.PUT_LINE(exeobj);
END LOOP;
END;

スポンサーリンク
タイトルとURLをコピーしました