Slide 21
Slide 21 text
© 2021 NTT DATA Corporation 21
2.保留統計の活用 ~19cで発生した問題②
保留統計でgather_table_statsで索引の統計情報を取得すると、索引の統計がnum_rows=0となってしま
うことがある
問題②
保留統計を使っている表に対して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;