DB Magazine 2005年2月号 の特集記事「オプティマイザ」徹底研究

これを読んでいると、結構知らないことがあったので以下にメモ(知らないことだけメモしてるので(記事の内容全てを整理しているわけではありません)。
ちなみに対象DBはOracle10g(10.0.3.0)なのでお仕事で使っているOracle9iにそのまま適用できるかどうかは不明です。

列値にばらつきがある場合のヒストグラム統計取得

analyze table テーブル名 compute statistics for all columns size パケットサイズ;
ex. analyze table emp compute statistics for all columns size 20;

大量のデータを格納している場合、compute statisticsを'estimate statistics 10%'にするほうが良い。
パケットサイズの指定が何故20が適切なのかは説明を読んでもよく分からず。読み直しが必要。

db_file_multiblock_read_countは「32」が適切

これはORACLE MASTERのパフォチューでも出てきたのですが、なぜ32なのかという説明があった。

オプティマイザの判断に影響を与える初期化パラメータの例

PARALLEL_EXECUTION_ENABLED
OPTIMIZER_FEATURES_ENABLE
CPU_COUNT
ACTIVE_INSTANCE_COUNT
PARALLEL_THREADS_PER_CPU
HASH_AREA_SIZE
BITMAP_MERGE_AREA_SIZE
SORT_AREA_SIZE
SORT_AREA_RETAINED_SIZE
DB_FILE_MULTIBLOCK_READ_COUNT
PGA_AGGREGATE_TARGET
OPTIMIZER_MODE
CURSOR_SHARING
STAR_TRANSFORMATION_ENABLED
OPTIMIZER_INDEX_COLST_ADJ
OPTIMIZER_INDEX_CACHING
QUERY_REWRITE_ENABLED
QUERY_REWRITE_INTEGRITY
WORKAREA_SIZE_POLICY
OPTIMIZER_DYNAMIC_SAMPLING
STATISTICS_LEVEL
SKIP_UNUSUABLE_INDEXES
_OPTIM_PEEK_USER_BINDS(隠しパラメータ)

この中でも設定次第で効果が出そうな部分ということで以下のパラメータが取り上げられている

  • OPTIMIZER_INDEX_COLST_ADJ

索引ブロックが何%くらいキャッシュヒットすると考えるか?デフォルト0%。大きいほどオプティマイザはインデックスアクセスのコストを低く見積もる。

  • OPTIMIZER_INDEX_CACHING

索引アクセスコストを通常の何%で計算するか?デフォルト100%。小さくするほどオプティマイザは索引アクセスのコストを低く見積もる。

例.
OPTIMIZER_INDEX_CACHING=90
OPTIMIZER_INDEX_COST_ADJ=25

索引を用意しているにもかかわらず、フルスキャンの発生率が高い場合は上記2パラメータの設定が良いらしい。

表数の結合は「6個」を基準にしたほうが良いらしい。

ORACLEの表同士の結合順序数の最大は2000となっている。9iまではOPTIMIZER_MAX_PERMUTATIONSパラメータで設定変更ができたが、10gからは廃止になった。
ここで表数が6個の場合、6!=720となる。7個の場合、7!=5040となるため、最大数が6個となる。