この記事では統計情報のロックを解除する方法について解説します。
統計情報がロックされる条件
統計情報を取得しようとすると、ORA-20005のエラーが発生してしまう場合があります。
SQL> exec DBMS_STATS.GATHER_TABLE_STATS ('TEST','DEPT');
BEGIN DBMS_STATS.GATHER_TABLE_STATS ('TEST','DEPT'); END;
*
行1でエラーが発生しました。:
ORA-20005: object statistics are locked (stattype = ALL)
これは統計情報がロックされている場合に発生します。
統計情報のロックが起こる例として、impdpによってメタデータを移行した場合が挙げられます。
CONTENT=METADATA_ONLYで移行した表はインポート後に統計情報がロックされる使用になっています。
メタデータの移行をした場合はその後に統計情報のロックを解除する必要があります。
統計情報がロックされている表を確認する方法
統計情報がロックされている表は下記のSQLで確認できます。
SELECT owner, table_name, object_type, stattype_locked
FROM dba_tab_statistics
WHERE stattype_locked IS NOT NULL AND owner=<スキーマ名>;
実際に確認してみると上記の表の統計情報がロックされていることがわかります。
SQL> SELECT owner, table_name, object_type, stattype_locked
2 FROM dba_tab_statistics
3 WHERE stattype_locked IS NOT NULL AND owner='TEST';
OWNER TABLE_NAME OBJECT_TYPE STATTYPE_LOCKED
----------------- ------------------------ ----------- ---------------
TEST DEPT TABLE ALL
統計情報のロックを解除する方法
統計情報のロックを解除するには以下のコマンドを実行します。
exec DBMS_STATS.UNLOCK_TABLE_STATS(<スキーマ名>,<テーブル名>);
スキーマ単位でまとめて解除する場合は次のコマンドになります。
exec DBMS_STATS.UNLOCK_SCHEMA_STATS(<スキーマ名>);
実際にロックを解除し、統計情報を取得してみます。
SQL> exec DBMS_STATS.UNLOCK_TABLE_STATS('TEST','DEPT');
PL/SQLプロシージャが正常に完了しました。
SQL> SELECT owner, table_name, object_type, stattype_locked
2 FROM dba_tab_statistics
3 WHERE stattype_locked IS NOT NULL AND owner='TEST';
レコードが選択されませんでした。
SQL> exec DBMS_STATS.GATHER_TABLE_STATS ('TEST','DEPT');
PL/SQLプロシージャが正常に完了しました。
ロックが解除され、統計情報を取得できました。