2010年2月17日

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


Takahito Yagami <yagami@xxxxx> wrote:

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

Prepared Statement を使い、REINDEX 前に実行計画がそのインデックスを

使わないよう固定されている場合に限り、REINDEX 中であっても
その準備済み文を実行できます。

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

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

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

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

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

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

投稿者 xml-rpc : 2010年2月17日 16:03
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/93403
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。