web-dev-qa-db-ja.com

大量のデータを含む既存のテーブルにインデックスを追加するとどうなりますか?

約1500万件のレコードを含むテーブルがあります。次に、テーブルにインデックスを追加する必要があります。

インデックスを追加すると、テーブル内のすべてのエントリが更新されるまでに時間がかかります。

インデックスを追加するとダウンタイムが発生するかどうか、私はかなり混乱しています。

はいの場合、どのようにしてダウンタイムを克服できますか?

11
Harry Suren

プレーンCREATE INDEXを使用すると、テーブルは書き込み用にロックされますが、読み取り用にはロックされません。

CREATE INDEX CONCURRENTLYを使用して、書き込みロックも回避します。

CREATE INDEX)のPostgreSQLドキュメントから

このオプションを使用すると、PostgreSQLは、テーブルの同時挿入、更新、または削除を防止するロックを取得せずにインデックスを構築します。一方、標準のインデックスビルドは、完了するまでテーブルへの書き込みをロックします(読み取りはロックしません)。このオプションを使用する場合は、いくつかの注意点があります— インデックスの同時作成 を参照してください。

そして より具体的に (同様に コメントされた@ypercube ):

PostgreSQLは書き込みをロックアウトせずにインデックスの作成をサポートしています。このメソッドは、CREATE INDEXCONCURRENTLYオプションを指定することによって呼び出されます。このオプションを使用する場合、PostgreSQLはテーブルの2つのスキャンを実行する必要があり、さらに、インデックスを使用して終了する可能性のある既存のトランザクションをすべて待機する必要があります。したがって、この方法では、標準のインデックス作成よりも多くの作業が必要であり、完了するまでに大幅に時間がかかります。ただし、インデックスが作成されている間も通常の操作を続行できるため、この方法は本番環境に新しいインデックスを追加する場合に役立ちます。

大胆な強調鉱山。

10