¿Qué sucede cuando agregamos un índice a una tabla existente con una gran cantidad de datos?

11

Tengo una tabla que contendrá alrededor de ~ 15 millones de registros. Ahora necesito agregar un índice a la tabla.

Agregar un índice llevará algún tiempo actualizar cada entrada en la tabla.

Estoy bastante confundido si agregar el índice causará tiempo de inactividad.

En caso afirmativo, ¿cómo puedo superar el tiempo de inactividad?

Harry Suren
fuente

Respuestas:

10

Con plain CREATE INDEX, la tabla se bloqueará para escrituras pero no para lecturas.

Use CREATE INDEX CONCURRENTLYpara evitar bloqueos de escritura también.

De los documentos de PostgreSQL enCREATE INDEX :

Cuando se usa esta opción, PostgreSQL construirá el índice sin tomar ningún bloqueo que evite inserciones, actualizaciones o eliminaciones concurrentes en la tabla; mientras que una compilación de índice estándar bloquea las escrituras (pero no las lecturas) en la tabla hasta que se realiza. Hay varias advertencias a tener en cuenta al usar esta opción: consulte Creación de índices concurrentes .

Y más específicamente (como comentó @ypercube ):

PostgreSQL admite la creación de índices sin bloquear las escrituras . Este método se invoca especificando la CONCURRENTLYopción de CREATE INDEX. Cuando se utiliza esta opción, PostgreSQL debe realizar dos escaneos de la tabla y, además, debe esperar a que finalicen todas las transacciones existentes que podrían utilizar el índice. Por lo tanto, este método requiere más trabajo total que una compilación de índice estándar y lleva mucho más tiempo completarlo. Sin embargo, dado que permite que las operaciones normales continúen mientras se construye el índice, este método es útil para agregar nuevos índices en un entorno de producción.

El énfasis audaz es mío.

Fabrizio Mazzoni
fuente