ANALYZE INDEX Oracleデータベース 断片化 リビルドインデックス メンテナンス

SET SERVEROUTPUT ON SIZE 50000 feedback off pagesize 0 trims on lines 1000 timing on time on
col analyze_index new_value analyze_index format a100
select 'analyze_index' || to_char(sysdate,'_YYYYMMDDHH24MISS') || '.csv' analyze_index from dual;
spool &analyze_index
declare
tname varchar2(100);
act_sql varchar2(300);
v_NAME varchar2(50);
v_HEIGHT number;
v_LF_ROWS number;
v_LF_BLKS number;
v_DEL_LF_ROWS number;
v_DEL_LF_ROWS_per_LF_ROWS number;
v_BLOCKS number;

begin
  DBMS_OUTPUT.ENABLE(NULL); --ORA-20000: ORU-10027: buffer overflow, limit of 20000 bytes 回避対応
  dbms_output.put_line('インデックス名'||','||'HEIGHT'||','||'リーフ行の数'||','||'リーフブロック数'||','||'削除リーフ行の数'||','||'削除リーフ割合'||','||'BLOCKS');
  for tab_rec in (select INDEX_NAME 
          from USER_INDEXES where 
          table_name = 'emp'
          order by table_name,INDEX_NAME)
  loop
    begin
      tname := tab_rec.INDEX_NAME;
      act_sql := 'analyze index ' || tname || ' validate structure';
      execute immediate act_sql;
      SELECT NAME,HEIGHT,LF_ROWS ,LF_BLKS ,DEL_LF_ROWS ,TO_CHAR(((DEL_LF_ROWS/DECODE(LF_ROWS,0,1,LF_ROWS))*100),'999.9'),BLOCKS INTO v_NAME,v_HEIGHT,v_LF_ROWS,v_LF_BLKS,v_DEL_LF_ROWS,v_DEL_LF_ROWS_per_LF_ROWS,v_BLOCKS FROM INDEX_STATS;
      dbms_output.put_line(v_NAME||','||v_HEIGHT||','||v_LF_ROWS||','||v_LF_BLKS||','||v_DEL_LF_ROWS||','||v_DEL_LF_ROWS_per_LF_ROWS||','||v_BLOCKS);
    EXCEPTION
      WHEN OTHERS THEN
      DBMS_OUTPUT.PUT_LINE('▼▼▼ 【 エラー!! '||tname||' ● '||SQLERRM||'】 ▼▼▼');
    end;
  end loop;
end;
/
SPOOL OFF

絵で見てわかるOracleの仕組み (DB Magazine SELECTION)

絵で見てわかるOracleの仕組み (DB Magazine SELECTION)

Oracle運用・管理の鉄則

Oracle運用・管理の鉄則

  • 作者:吉村 隆
  • 発売日: 2010/04/24
  • メディア: 単行本(ソフトカバー)
プロとしてのSQLチューニング入門

プロとしてのSQLチューニング入門