13.7. Bloqueos e índices #

Aunque PostgreSQL proporciona acceso de lectura/escritura no bloqueante a los datos de las tablas, actualmente no se ofrece acceso de lectura/escritura no bloqueante para todos los métodos de acceso a índices implementados en PostgreSQL. Los distintos tipos de índices se gestionan de la siguiente manera:

Índices B-tree, GiST y SP-GiST

Se utilizan bloqueos a nivel de página compartidos/exclusivos a corto plazo para el acceso de lectura/escritura. Los bloqueos se liberan inmediatamente después de recuperar o insertar cada fila del índice. Estos tipos de índice proporcionan la mayor concurrencia sin condiciones de callejón sin salida.

Índices Hash

Se utilizan bloqueos a nivel de bucket de hash compartidos/exclusivos para el acceso de lectura/escritura. Los bloqueos se liberan después de procesar todo el bucket. Los bloqueos a nivel de bucket proporcionan una mejor concurrencia que los de nivel de índice, pero es posible que se produzca un callejón sin salida, ya que los bloqueos se mantienen durante más tiempo que una operación de índice.

Índices GIN

Se utilizan bloqueos a nivel de página compartidos/exclusivos a corto plazo para el acceso de lectura/escritura. Los bloqueos se liberan inmediatamente después de recuperar o insertar cada fila del índice. Pero ten en cuenta que la inserción de un valor indexado por GIN suele producir varias inserciones de claves de índice por fila, por lo que GIN puede realizar un trabajo sustancial para la inserción de un solo valor.

Actualmente, los índices B-tree ofrecen el mejor rendimiento para aplicaciones concurrentes; dado que también tienen más características que los índices hash, son el tipo de índice recomendado para aplicaciones concurrentes que necesitan indexar datos escalares. Cuando se trata de datos no escalares, los B-trees no son útiles y en su lugar deben utilizarse índices GiST, SP-GiST o GIN.