[pgsql-jp: 40182] REINDEX中のロックについて
Takahito Yagami
yagami @ news2u.co.jp
2010年 2月 17日 (水) 15:29:23 JST
やがみともうします。
初めて投稿させていただきました。
基本的な事なのかもしれませんが教えて下さい。
■環境
・CentOS 5.3
・PostgreSQL 8.37
マニュアルを見ると、「REINDEXはインデックスの元となるテーブルの
書き込みをロックしますが、読み込みはロックしません。」とあり
トランザクションがなければ、運用中にREINDEX実施できるのでは
ないかと思っていました。
http://www.postgresql.jp/document/pg837doc/html/sql-reindex.html
ところが、REINDEX中に実際にSELECT文を流してみると、
REINDEXが終わるまでwaitになってしまいました。
簡略化したサンプルとして、table1 に column1, column2 があるとします。
下記で全文検索(Ludia)用のインデックスを作成してあり、
CREATE INDEX senna_table1_column1 ON table1 USING fulltextb (column1);
下記コマンドでREINDEXします、
REINDEX INDEX senna_table1_column1;
このREINDEX中のロック状態は、
・table1テーブルに ShareLock
・senna_table1_column1インデックスに ShareUpdateExclusiveLock と AccessExclusiveLock
の状態でした。この状態で該当インデックスを使用しない
下記SELECT文はREINDEXが終わるまで返ってきませんでした。
select * from table1 limit 10;
§
また、上記はLudia側の問題の可能性もあると思い btree インデックスでも
同じようなテストをしました。
同じテーブルのcolumn2にbtreeインデックスをはる
CREATE INDEX senna_table1_column2 ON table1 USING btree (column2);
下記コマンドでREINDEXします、
REINDEX INDEX senna_table1_column2;
このREINDEX中のロック状態は、
・table1テーブルに ShareLock
・senna_table1_column1インデックスに AccessExclusiveLock
(ShareUpdateExclusiveLockはありませんでした)
この場合も同じく、下記SELECT文はREINDEXが終わるまで返ってきませんでした。
select * from table1 limit 10;
§
AccessExclusiveLock がSELECT文をブロックしていそうなのはわかるのですが、
実行計画上で ロック中のインデックスを参照しなければ SELECTは
できると思っていましたが、上記が正常動作でしょうか?
また、その場合マニュアルの「REINDEXはインデックスの元となるテーブルの
書き込みをロックしますが、読み込みはロックしません。」という表現の
意味するところはどうなるでしょうか?
根本的に勘違いしている可能性もありますが、どなたかご教授ください。
--
矢上貴人(ヤガミタカヒト) <yagami @ news2u.co.jp>
pgsql-jp メーリングリストの案内