ほとんどのケースでは統計情報は自動取得に任せてしまっていいんですが、処理の作り方によっては特定の時点の統計情報で固定しておきたい、って場合が出てきます。
たとえば、夜間の自動統計取得時には0件なのに、早朝のバッチ処理の中で大量のデータを取り込んで回すような処理では、夜間の統計ではなく、データ取り込み後の統計を使いたいものです。
もちろん、取り込み後に統計を取り直すのが王道かもしれませんが。
統計がロックされているか確認する
SELECT TABLE_NAME, STATTYPE_LOCKED, NUM_ROWS, LAST_ANALYZED FROM USER_TAB_STATISTICS WHERE OWNER = 'XXXXX' AND TABLE_NAME = 'XXXXX';
STATTYPE_LOCKEDがALLになっていたらロックされてます。
統計情報をロックする
EXEC DBMS_STATS.LOCK_TABLE_STATS('SCHEMA_NAME','TABLE_NAME');
統計情報のロックを解除する
EXEC DBMS_STATS.UNLOCK_TABLE_STATS('SCHEMA_NAME','TABLE_NAME');
DatapumpでMETADATA_ONLY(定義だけ)インポートをすると統計がロックされる罠
意識してロックした覚えはないのに統計情報がロックされていたので原因を調べました。
METADATA_ONLY: データベース・オブジェクト定義のみがロードされます。表の行データはロードされません。CONTENT=METADATA_ONLYを指定した場合、ダンプ・ファイルからインポートされる任意の索引または表の統計は、インポート操作の完了後にロックされることに注意してください。