ANALYZE TABLE


オプティマイザが使用する統計情報を収集してデータディクショナリに格納する。
オプションはANALYZE INDEXと同じ。

-- 全データの10%を使用して、統計情報を作成する
ANALYZE TABLE テーブル名 ESTIMATE STATISTICS SAMPLE 10 PERCENT;

-- 全データを使用して統計情報を作成する
ANALYZE TABLE テーブル名 COMPUTE STATISTICS;

-- 統計情報を削除する
ANALYZE TABLE テーブル名 DELETE STATISTICS; 

-- 対象テーブルにロックをかけて構造の整合性を検証する
ANALYZE TABLE テーブル名 VALIDATE STRUCTURE;


COMPUTE STATISTICSで統計した情報はUSER_TABLESに格納される。(NUM_ROWS、BLOCKなど)




すべてのテーブルをANALYZEするSQL

	--*=====================================================*
	--*     全テーブルの行数取得 & ANALYZE                  *
	--*=====================================================*


SET SERVEROUTPUT ON;


DECLARE

	--*=====================================================*
	--*     変数定義                                        *
	--*=====================================================*

	WK_SQL			VARCHAR(1000);
	WK_RETURN		NUMBER;

	--カーソル定義
	CURSOR curUSER_TABLES IS
			SELECT
					 	TABLE_NAME
			FROM		USER_TABLES
			ORDER BY 	TABLE_NAME
			;

	recUSER_TABLES	 	curUSER_TABLES%ROWTYPE;


BEGIN

	OPEN curUSER_TABLES;

	LOOP

		FETCH curUSER_TABLES INTO recUSER_TABLES;
		EXIT WHEN curUSER_TABLES%NOTFOUND;

		--件数の取得
		WK_SQL := 'SELECT COUNT(*) FROM ' || recUSER_TABLES.TABLE_NAME;
		EXECUTE IMMEDIATE WK_SQL INTO WK_RETURN;

		--件数の出力
		DBMS_OUTPUT.PUT_LINE(recUSER_TABLES.TABLE_NAME || ',' || WK_RETURN);

		--統計情報の取得
		EXECUTE IMMEDIATE 'ANALYZE TABLE ' || recUSER_TABLES.TABLE_NAME || ' COMPUTE STATISTICS';

	END LOOP;

	CLOSE curUSER_TABLES;


END;
/

取得した統計情報を閲覧するSQL

SELECT TABLE_NAME,NUM_ROWS,BLOCKS,EMPTY_BLOCKS,AVG_SPACE FROM USER_TABLES