[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 メーリングリストの案内