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


11

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

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

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

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


回答:


10

plain CREATE INDEXでは、テーブルは書き込み用にロックされますが、読み取り用にはロックされません。

CREATE INDEX CONCURRENTLY書き込みロックも回避するために使用します。

CREATE INDEXPostgreSQLドキュメントから

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

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

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

大胆な強調鉱山。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.