• 11gからの移行では、特に適応問い合わせ最適化のパラメータを確実に設定 • ダイレクト・パス・ロードのオンライン統計収集も注意が必要 • 現行パラメータ調査(ボトムアップ)から引き継ぐべきパラメータを精査 • 10053トレースを取得し、パラメータを突合し、設定値の差について取り込むべきかを精査する • 以下を新・旧システムで実行し、トレース内のオプティマイザ関連パラメータ一覧を確認する • 値が一致していないものについて、特に旧システムで明示的に変更しているものは、理由を確認し、取り 込むべきか精査する • 隠しパラメータは基本的に変更しない方が良い(不具合回避目的でサポート指示のもの変更するもの) -- to enable the 10053 trace alter session set events ‘10053 trace name context forever’; <SQL実行> -- stop tracing alter session set events ‘10053 trace name context off’; -- to enable the 10053 trace alter session set events ‘10053 trace name context forever’; <SQL実行> -- stop tracing alter session set events ‘10053 trace name context off’;
問題② 保留統計を使っている表に対してgather_table_statsで表と一緒に索引の統計情報を取得するとき(カスケードオプション有効)、ある 条件を満たすと索引の統計が適切に取得できない(表の件数が有件なのに、索引の統計(num_rows)が0になってしまう) 事象 表の(パブリッシュされた)統計(num_rows)が0で、保留統計を使っており、gather_table_statsでカスケードオプション有効にした 場合に発生する 発生条件 製品不具合 ※新規不具合のため、パッチは確認できていないが、少なくとも19.11.0で再現することを確認している 原因 そもそも表が0件統計となる状況自体はレアケースなため、実運用上は顕在化する可能性は低い。新規表をリリースする場合等、0件が発 生するケースにおいては注意が必要。 運用対処として、保留統計の公開前に以下のチェックSQLで、索引統計のnum_rowsが0件となっている索引を抽出しチェックする。 問題となる索引については、手動で索引の統計情報をdbms_stats.gather_index_statsで手動で取得すればよい。 対処方法 再現テストケース等 gather_table_stats doesn't gather related index stats properly when pending stats are enabled https://community.oracle.com/mosc/discussion/4497632 参考 -- check sql of index stats select t.owner, t.table_name, dt.num_rows nrows, t.num_rows p_nrows, i.index_name, i.num_rows p_nrows from dba_tab_pending_stats t, dba_ind_pending_stats i, dba_tab_statistics dt where t.owner=i.owner and t.table_name=i.table_name and dt.owner=t.owner and dt.table_name=t.table_name and t.num_rows>0 and i.num_rows =0 and dt.num_rows = 0 order by t.owner, t.table_name,i.index_name; -- check sql of index stats select t.owner, t.table_name, dt.num_rows nrows, t.num_rows p_nrows, i.index_name, i.num_rows p_nrows from dba_tab_pending_stats t, dba_ind_pending_stats i, dba_tab_statistics dt where t.owner=i.owner and t.table_name=i.table_name and dt.owner=t.owner and dt.table_name=t.table_name and t.num_rows>0 and i.num_rows =0 and dt.num_rows = 0 order by t.owner, t.table_name,i.index_name;