Postgres se basa en diferentes cerraduras para garantizar que todas las transacciones puedan ejecutarse como se esperaba. La transacción que primero obtiene un bloqueo debe completarse. A menos que se realice una reversión o confirmación, otra transacción no puede avanzar debido al bloqueo. Nuestro enfoque hoy es comprender cómo crear índices simultáneamente para evitar el bloqueo.
¿Cómo funciona el bloqueo?
Antes de sumergirse en la creación de índices simultáneamente, vale la pena entender cómo Postgres implementa bloqueos y ver cómo afectan la transacción a menos que sepa cómo lidiar con ellos.
Para este caso, creamos una tabla e iniciamos una transacción para alterar la tabla para agregar una nueva columna. A partir de la siguiente imagen, podemos ver que una vez que la transacción alter se retira del bloqueo como la primera transacción, el comando seleccionar no responde en el segundo shell de PSQL.
Este caso ocurre porque la primera transacción emite un bloqueo. Se encontrará con un caso similar cuando no se indexe simultáneamente, como veremos en la sección posterior.
Sin embargo, cuando emite un comando de reversión a la primera transacción, podemos notar de inmediato que se libera el bloqueo. Ahora, la segunda transacción puede proceder ininterrumpida.
Así es como funcionan las cerraduras en las mesas. Bloques Transacciones de lectura y escritura cuando se ejecuta un comando DDL. Con ese entendimiento, podemos pasar a crear índices simultáneamente.
Cómo usar PostgreSQL para crear un índice simultáneamente
Al crear índices en PostgreSQL, la operación puede bloquear rápidamente todas las demás transacciones y puede conducir a pérdidas. Al indexar una tabla, Postgres la bloquea en las operaciones de escritura, como operaciones de actualización y alter, hasta que se complete la compilación del índice.
La transacción de índice puede tomar horas o largos minutos, dependiendo del tamaño de su base de datos. El bloqueo de otras transacciones en un entorno de producción significa que el sistema puede volverse inutilizable hasta que se complete la construcción del índice. Si tiene tal escenario, la mejor solución es crear índices simultáneamente, lo que eliminará con cerraduras.
La indexación garantiza simultáneamente que una transacción no bloquee otras transacciones. Por lo tanto, las transacciones normales pueden ocurrir en el medio de un proceso de compilación. Cuando agrega simultáneamente al indexar, PostgreSQL escanea la tabla indexada y espera que todas las transacciones terminen. Por lo tanto, la indexación simultáneamente toma más tiempo, pero asegura que no se encuentren demoras en un entorno de producción. Veamos un ejemplo de indexación normal para comprender cómo el bloqueo puede causar caos en un entorno de producción.
Aquí, tenemos una tabla llamada "Detalles" en la que accedimos en nuestro shell de Postgres. Supongamos que queremos crear un índice "btree" en una columna. Podemos ejecutar el siguiente comando:
Nuestro índice se crea con éxito porque estamos tratando con una pequeña mesa.
Sin embargo, el mismo comando podría tardar horas en ejecutarse si está en un entorno de producción en vivo. Si abre otro shell de PSQL e intenta escribir en la misma tabla, el shell no responderá hasta que se complete la indexación. Si alguien intenta actualizar, insertar o realizar otra operación de escritura, se bloqueará.
Tal escenario se puede solucionar indexando la misma tabla simultáneamente. La siguiente es la sintaxis para crear un índice simultáneamente:
Crear índice simultáneamente el nombre de índice en el nombre de tabla (nombre de columna)
Si queremos repetir el mismo índice que hicimos antes, pero, en este caso, simultáneamente, nuestro nuevo comando sería el siguiente:
En este caso, si la indexación lleva más tiempo y abrimos otro shell para realizar una operación de escritura en la tabla que estamos indexando, no podríamos obtener ningún error de bloqueo ya que la compilación del índice se realiza simultáneamente.
También puede crear un "índice concurrente único" agregando la palabra clave "única". La indexación única elimina la redundancia y aumenta los errores cada vez que detecta un valor de columna redundante.
Aquí hay un ejemplo de indexación concurrente única:
Cuando ve la tabla de índice, notará que la indexación ocurrió con éxito y puede ver qué columna tiene la indexación única.
# \ d Nombre de la tabla;Conclusión
Crear un índice sin un enfoque concurrente conduce a las transacciones de bloqueo y bloqueo. Sin embargo, cuando indexa simultáneamente, la compilación del índice se completará sin evitar que ocurran otras transacciones. Esta publicación lo ayuda a comprender cómo funciona el bloqueo cuando se trabaja con tablas en Postgres. Además, explicamos cómo crear un índice simultáneamente para evitar el bloqueo cuando se trabaja con PostgreSQL.