oracle

統計情報が失効した(無効になった)事を確認する

一度取得された統計情報(表統計、索引統計)は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>

統計情報の取得はこちらです。

スポンサーリンク