一度取得された統計情報(表統計、索引統計)は10%を超えるレコード更新がされると無効(失効)になるのでこれを確認しました。注意点として、レコード更新がされ無効になるには少しタイムラグがあります。これを直ぐに反映するには DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO() プロシージャを手動で実行する必要があります。
-- 表統計が無効になっているテーブル一覧(スキーマ別) select t.OWNER,t.TABLE_NAME,t.NUM_ROWS,t.LAST_ANALYZED,t.STALE_STATS from DBA_TAB_STATISTICS t where t.OWNER='SOONI' and t.STALE_STATS ='YES' ;
-- 索引統計が無効になっているインデックス一覧(スキーマ別) select t.TABLE_OWNER,t.TABLE_NAME,t.INDEX_NAME,t.STALE_STATS,t.LAST_ANALYZED from DBA_IND_STATISTICS t where t.OWNER='SOONI' and t.STALE_STATS ='YES' ;
列統計についてはDBA_TAB_COL_STATISTICSにSTALE_STATSカラムが存在しないので表統計の状態に依存するのだと思います。列統計(ヒストグラム)の情報はDBA_TAB_COL_STATISTICSを見る必要があるのですが、注意点あります。こちらのビューは「列統計の取得が行われたカラムのみ」もっています。あるテーブルのあるカラムのヒストグラムが取得されているかどうかの確認はDBA_TAB_COLSで行う必要があります。
-- 列統計 select t.OWNER,t.TABLE_NAME,t.COLUMN_NAME,t.HISTOGRAM,t.LAST_ANALYZED from DBA_TAB_COL_STATISTICS t where t.OWNER='SOONI' and t.TABLE_NAME ='TBL26' ;
SQL> set sqlformat ansiconsole
-- 統計情報の取得
SQL> BEGIN
2 DBMS_STATS.GATHER_TABLE_STATS(
3 OWNNAME => 'SOONI'
4 ,TABNAME => 'TBL26'
5 ,METHOD_OPT => 'FOR ALL COLUMNS SIZE AUTO' -- Oracle任せ
6 );
7 END;
8 /
PL/SQLプロシージャが正常に完了しました。
--
-- 各種統計情報が取得できている事を確認する
--
SQL> ALTER SESSION SET NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS';
SQL> select t.OWNER,t.TABLE_NAME,t.NUM_ROWS,t.LAST_ANALYZED,t.STALE_STATS
2* from DBA_TAB_STATISTICS t where t.OWNER='SOONI' and t.TABLE_NAME ='TBL26';
OWNER TABLE_NAME NUM_ROWS LAST_ANALYZED STALE_STATS
________ _____________ ___________ ______________________ ______________
SOONI TBL26 1739995 2021-11-07 22:57:10 NO
SQL> select t.TABLE_OWNER,t.TABLE_NAME,t.INDEX_NAME,t.STALE_STATS,t.LAST_ANALYZED
2* from DBA_IND_STATISTICS t where t.OWNER='SOONI' and t.TABLE_NAME ='TBL26';
TABLE_OWNER TABLE_NAME INDEX_NAME STALE_STATS LAST_ANALYZED
______________ _____________ ______________ ______________ ______________________
SOONI TBL26 TBL26_IDX01 NO 2021-11-07 22:57:26
SQL> select t.OWNER,t.TABLE_NAME,t.COLUMN_NAME,t.HISTOGRAM,t.LAST_ANALYZED
2* from DBA_TAB_COL_STATISTICS t where t.OWNER='SOONI' and t.TABLE_NAME ='TBL26';
OWNER TABLE_NAME COLUMN_NAME HISTOGRAM LAST_ANALYZED
________ _____________ ______________ ____________ ______________________
SOONI TBL26 COL1 NONE 2021-11-07 22:57:07
SOONI TBL26 COL2 NONE 2021-11-07 22:57:07
SOONI TBL26 COL3 NONE 2021-11-07 22:57:07
SOONI TBL26 COL4 NONE 2021-11-07 22:57:07
SOONI TBL26 COL5 FREQUENCY 2021-11-07 22:57:07
SOONI TBL26 AUTO_ID NONE 2021-11-07 22:57:07
6行が選択されました。
SQL> update tbl26 t set t.COL5='11_sooni' where t.COL5 like '11%';
187,998行更新しました。
SQL>
SQL> commit;
コミットが完了しました。
-- 10%を超えるレコードの更新をした後統計情報を再度確認
--
SQL> select t.OWNER,t.TABLE_NAME,t.NUM_ROWS,t.LAST_ANALYZED,t.STALE_STATS
2* from DBA_TAB_STATISTICS t where t.OWNER='SOONI' and t.TABLE_NAME ='TBL26';
OWNER TABLE_NAME NUM_ROWS LAST_ANALYZED STALE_STATS
________ _____________ ___________ ______________________ ______________
SOONI TBL26 1739995 2021-11-07 22:57:10 NO
SQL> select t.TABLE_OWNER,t.TABLE_NAME,t.INDEX_NAME,t.STALE_STATS,t.LAST_ANALYZED
2* from DBA_IND_STATISTICS t where t.OWNER='SOONI' and t.TABLE_NAME ='TBL26';
TABLE_OWNER TABLE_NAME INDEX_NAME STALE_STATS LAST_ANALYZED
______________ _____________ ______________ ______________ ______________________
SOONI TBL26 TBL26_IDX01 NO 2021-11-07 22:57:26
SQL>
-- 上記の通り「まだ無効になっていない( STALE_STATS=NO のまま)」
-- 手動で最新更新情報をディクショナリへ繁栄
SQL> exec DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO()
PL/SQLプロシージャが正常に完了しました。
-- 再度確認すると以下の通り、統計情報が無効になっている
--
SQL> select t.OWNER,t.TABLE_NAME,t.NUM_ROWS,t.LAST_ANALYZED,t.STALE_STATS
2* from DBA_TAB_STATISTICS t where t.OWNER='SOONI' and t.TABLE_NAME ='TBL26';
OWNER TABLE_NAME NUM_ROWS LAST_ANALYZED STALE_STATS
________ _____________ ___________ ______________________ ______________
SOONI TBL26 1739995 2021-11-07 22:57:10 YES
SQL> select t.TABLE_OWNER,t.TABLE_NAME,t.INDEX_NAME,t.STALE_STATS,t.LAST_ANALYZED
2* from DBA_IND_STATISTICS t where t.OWNER='SOONI' and t.TABLE_NAME ='TBL26';
TABLE_OWNER TABLE_NAME INDEX_NAME STALE_STATS LAST_ANALYZED
______________ _____________ ______________ ______________ ______________________
SOONI TBL26 TBL26_IDX01 YES 2021-11-07 22:57:26
SQL>
統計情報の取得はこちらです。