2016-07-26 4 views
1

私は、アプリケーションによって常にアクセスされているテーブルの1つにオンラインでインデックスを作成するためのスクリプトを作成しています。私は、バックアウトが必要な場合に備えて、オンラインでインデックスをドロップする方法があるかどうかを知りたいと思います。DML操作の進行中にインデックスを削除する

私は排他ロックを取ることなく、インデックスを削除しようとする場合、それはORA-00054を与えるので、私はこれを求めていた理由がある11.2.0.4.0

Oracle Database 11gのを使用しています - 忙しいリソース。オラクルの医者は、私が12cのためにオンラインで使うことができると言っています。これを11gでも達成する方法はありますか? DROP INDEX [ schema. ] index [ ONLINE ] [ FORCE ] ;

答えて

3

あなたはddl_lock_timeoutは(私はテーブルが永遠にロックされることはありません推測する)試してみてください:

DDL_LOCK_TIMEOUTが は、DMLロックキュー内で待機する時間DDL文の制限時間を指定

alter session set ddl_lock_timeout = 1000000; 
drop index idxName; 

たぶん、あなたはINVISIBLE最初にそれを変更することを検討すべきである:

ALTER INDEX idName INVISIBLE; 
+1

ありがとう@vercelli。私の指数はかなり小さく、このアプローチはうまくいきました。しかし、それがどのように大規模なインデックスのオブジェクトで動作するか見て興味深いだろう。 – Ankit

+0

@Ankitインデックスを削除するのはかなり速くなければなりません。ロックがドロップインデックスによって取得されると、残りのクエリは待機する必要があります – vercelli

関連する問題