[pgsql-jp: 40184] Re: REINDEX中のロックについて

Takahiro Itagaki itagaki.takahiro @ oss.ntt.co.jp
2010年 2月 17日 (水) 16:03:44 JST


Takahito Yagami <yagami @ news2u.co.jp> wrote:

> AccessExclusiveLock がSELECT文をブロックしていそうなのはわかるのですが、
> 実行計画上で ロック中のインデックスを参照しなければ SELECTは
> できると思っていましたが、上記が正常動作でしょうか?

Prepared Statement を使い、REINDEX 前に実行計画がそのインデックスを
使わないよう固定されている場合に限り、REINDEX 中であっても
その準備済み文を実行できます。

   端末1  |  端末2
----------+-----------
 PREPARE  |
    ↓    | REINDEX
 EXECUTE  |

の順ならば、EXECUTE でブロックされないパターンを確認できるかと思います。

ただ、Prepared Statement を使わない場合や、REINDEX 中に PREPARE してしまうと、
プランニングの最中にインデックスが使えるかどうか調べるために
すべてのインデックスを共有ロックしてしまうため、そこで待たされます。
最終的にはそのインデックスを使わない実行計画になる場合であってもダメです。

> また、その場合マニュアルの「REINDEXはインデックスの元となるテーブルの
> 書き込みをロックしますが、読み込みはロックしません。」という表現の
> 意味するところはどうなるでしょうか?

この文自体には嘘は無いのですが、上記のような動作のため、実質的には
「REINDEX 中は、そのインデックスが張られたテーブルの読み書きはできない」
として扱うしかないと思われます。

------------------------------------------------------------
NTT オープンソース ソフトウェア センタ
板垣貴裕 <itagaki.takahiro @ oss.ntt.co.jp>




pgsql-jp メーリングリストの案内