CLUSTER後にREINDEXが必要ですか?


12

CLUSTERを使用して、インデックスでテーブルを並べ替えることを検討しています。このテーブルデータの再作成により、既存のすべてのインデックスが肥大化するか、役に立たなくなることがわかります。CLUSTERの後にREINDEXが必要であるという兆候を見てきました。CLUSTER REINDEXを行うことを示す他の参照を見つけました。公式ドキュメントは、(それがCLUSTER後にANALYZEを実行している示唆んが)REINDEXがクラスタの一部である、または必要についてのすべてでは何も言いません

誰もが明確に(つまり、公式ドキュメントへの何らかの参照を持っている)、CLUSTER後にREINDEXが必要かどうかを言うことができますか?


2
私はそれが必要だとは思わない。cluster行を再配置するため、とにかくインデックス情報を更新する必要があります。
a_horse_with_no_name

はい、しかし、私が見つけた議論の半分の理論は、インデックスが膨張する原因になるということです。
TREE

回答:


12

インデックスを再作成する必要はありませんCLUSTER。効果的にインデックスを作成するからです。

より具体的にはCLUSTER、ソーステーブルをロックしてから、ターゲットインデックスに従って順序付けられた新しいコピーを作成します。新しいコピーにインデックスを作成し、古いテーブルとインデックスを新しいものに置き換えます。

これはVACUUM FULL9.0以降でも当てはまることに注意してください。

CLUSTER肥大化することを示唆する議論を見てきたなら、CLUSTER9.0以前のように機能すると想定している人かもしれませんVACUUM FULL。古いVACUUM FULL実装によって引き起こされたインデックスの膨張に言及CLUSTERし、代替手段として提案する議論を見て誤解しているかもしれません。

これはドキュメントで暗示されています

インデックス順にテーブルデータを含むテーブルの一時コピーが作成されます。テーブルの各インデックスの一時コピーも作成されます。したがって、少なくともテーブルサイズとインデックスサイズの合計に等しいディスク上の空き領域が必要です。

言っていないが、そうすべきであるのは、それらの一時コピーが元のテーブルを置き換えるということです。(大胆な鉱山)。


1
CLUSTERがインデックスを置き換える参照はありますか?

1
@TREEが追加されました。ドキュメントでは、一時テーブルとインデックスが元のテーブルを置き換えることを明示的に示していませんが、実際にCLUSTERの前後にデータディレクトリを見る場合、またはソースコードを調べる場合にそうなります。
クレイグリンガー

これをテストしましたが、少なくとも私のテストシナリオでは、インデックスファイルのサイズが小さくなりました。しかし、これは1つのシナリオにすぎず、動作に影響する変数(インデックスの数、ディスク上の合計サイズなど)が多数存在する可能性があるため、単純なテストは信頼できません。

1
@TREE考えられるすべての状況での動作を確実に理解するには、ソースコードを読む必要があります。私はあなたを伝えることができるすべては、私がどのような状況を認識していないよということであるCLUSTERではないでインデックスを書き換えて、実際のファイルの検査base/明確に新しい表示されますrelfilenode秒。まだ抱えていない問題を心配しているようです。
クレイグリンガー

8

これにはa_horse_with_no_nameを使用しています。インデックスを再作成する必要はありません。ことのほかにCLUSTERドキュメントがそれを言及していない、我々はさらに相談することができREINDEX、ページをあまりにも:

REINDEXを使用するシナリオはいくつかあります。

  • インデックスが破損し、有効なデータが含まれなくなりました。理論上はこれが起こるべきではありませんが、実際にはソフトウェアのバグやハードウェアの障害によりインデックスが破損する可能性があります。REINDEXは回復方法を提供します。

  • インデックスは「肥大化」しており、多くの空または空に近いページが含まれています。これは、特定の一般的でないアクセスパターンの下で、PostgreSQLのBツリーインデックスで発生する可能性があります。REINDEXは、デッドページなしで新しいバージョンのインデックスを書き込むことにより、インデックスのスペース消費を削減する方法を提供します。詳細については、セクション23.2を参照してください。

  • インデックスのストレージパラメータ(fillfactorなど)を変更しましたが、変更が完全に有効になるようにします。

  • CONCURRENTLYオプションを使用したインデックスの構築が失敗し、「無効な」インデックスが残りました。このようなインデックスは役に立ちませんが、REINDEXを使用してインデックスを再構築すると便利です。REINDEXは同時ビルドを実行しないことに注意してください。実動を妨げることなく索引を作成するには、索引をドロップして、CREATE INDEX CONCURRENTLYコマンドを再発行する必要があります。

明らかに、CLUSTERこれらのケースのいずれにも該当しません。

そして、CLUSTERドキュメントには小さな文があります:

[クラスタリング中]テーブルの各インデックスの一時コピーも作成されます。

これは、テーブル自体と同様に、プロセス中にもインデックスの順序が変更されることを示唆しています。この方法では、インデックスの再作成が不要になります。


提案は確かにそこにあり、テストはそれを確認するようです。インデックスが(永久に)再作成されるとドキュメントが実際に言っていれば、この動作に頼る方が良い思います。

2
ここにドキュメントパッチの資料があります。マニュアルでは、インデックスの再作成についてより明確にする必要があります。
アーウィンブランドステッター

この時点での私の疑いは、開発者がこの動作に永続的に結び付けられたくないので、この動作を公式に文書化したくないということです。

@TREEバージョン間で多くの機能が変更され、それに応じてドキュメントが(主に)変更されます。おそらく仕様も変更されると思われます:)。
-dezso

@dezso本当ですが、文書化された機能を削除することに消極的です。一般的なドキュメントの品質を考えると、この動作の省略は意図的なものであると私はまだ仮定しています。

5

Recovering Disk Spaceセクションで参照を見つけました。

そのようなテーブルがあり、それが占有する余分なディスク領域を再利用する必要がある場合は、VACUUM FULL、またはCLUSTERまたはALTER TABLEのテーブル書き換えバリアントのいずれかを使用する必要があります。これらのコマンドは、テーブルの新しいコピー全体を書き換え、新しいインデックス作成します。


-3

私の意見では、すべての答えを分析する正しい方法は、クラスターの前にインデックスを再作成することです。ドキュメントでは、クラスターがインデックスの再作成を行うかどうか、およびインデックスのコピーのみを順序付けているかどうかを示していないため、インデックス付きインデックスの方がクラスター化されたテーブルが優れていると思います。その後、分析によってジョブが終了します。クラスターやインデックスの再構築でデッドタプルが解放されない限り、すべての前にバキュームがいっぱいになると役に立たないようです


受け入れられた答えで述べたように、ドキュメント、CLUSTERコマンドに関するページではなく、インデックスが再構築されると述べています。

そして、両方とも真新しい物理的なテーブルCLUSTERVACUUM FULL生成します-それの後に死者がいることはありません。古いコピーで使用されていたスペースは、操作の終了までに解放されます。
-dezso

確かに。テーブルとすべてのインデックスを再作成します。しかし、クラスターがテーブルの並べ替えに使用するインデックスについては疑問があります。最初にインデックスが再作成されますか、それともテーブルをそのまま並べ替えるために使用されますか?そしてその後、インデックスが再作成されますか?...問題のインデックスはいくつかの問題が発生する可能性があるため
アイランルイスWendling
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.