2007年7月25日水曜日

oracleのアナライズ

■実行計画確認

●コストベースかルールベースかの判断方法
set linesize 1000
set pagesize 100
column table_name format a20

SELECT table_name, num_rows, blocks, avg_row_len,
to_char(last_analyzed, 'MM/DD/YYYY HH24:MI:SS')
FROM dba_tables;

→情報が空のテーブルはルールベースである。
→last_analyzedにて前回実行時の時間が確認可能。

【カラム】
NUM_ROWS:
行数
BLOCKS:
最高水位標(HWM)までのブロックの数
EMPTY_BLOCKS:
表に割当てられているが未使用の(HWMよりも上にある)ブロックの数
AVG_SPACE:
各データ・ブロックにおける使用可能な空き領域サイズの平均(バイト単位)
CHAIN_CNT:
行連鎖または行移行が発生している行数
AVG_ROW_LEN:
行の平均サイズ(バイト単位)
AVG_SPACE_FREELIST_BLOCKS:
空きリスト(フリーリスト)につながっているブロックの空き領域サイズの平均(バイト単位)
NUM_FREELIST_BLOCKS:
空きリスト(フリーリスト)につながっているブロックの数
SAMPLE_SIZE:
統計の収集をESTIMATE指定で行った時のサンプル・サイズ
LAST_ANALYZED:
最新の統計収集日時

●ルールベースに戻す
ANALYZE TABLE 表名 DELETE STATISTICS;

●初期設定値確認
show parameter optimizer_mode;

RULE
 オプティマイザはルールベースを採用する
CHOOSE(デフォルト値):
 統計情報が使用可能か(ANALYZEが実行されているか)どうかを判断し、
 統計情報が使用できればコストベース、そうでない場合はルールベースを採用する
ALL_ROWS
 サーバ内リソースの最小使用とスループットの最小化を行う
FIRST_ROWS
 応答時間が最短となるよう検索を行う。検索結果の1行目に対する応答時間を最適化する

■Analyzeの実行

ANALYZE TABLE <対象テーブル名> <オプション>;

◎オプション
COMPUTE STATISTICS
 表全体を対象にアナライズを実行する。
 1回のresadコールで読み込まれるデータ量は
  「db_block_size×db_file_multiblock_read_count」

ESTIMATE STATISTICS
 対象となる表の中からアナライズに使用する行をサンプリング。
 行抽出動作はシングルブロック単位。
 サンプリング率の指定が必要。
→50%以上だとCOMPUTE STATISTICSと同じ動作。

■インポート、エクスポート時の統計情報の扱い
→STATISTICSオプションにて統計情報の移行方法が変更可能。
<デフォルト>
 EXP:ESTIMATE
 IMP:ALWAYS
  →コピーしたくない場合は「NONE」に設定。

0 件のコメント: