オプティマイザが使用する統計情報を収集してデータディクショナリに格納する。
オプションは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