67.1.1. Mantenimiento de índices

BRIN significa Block Range Index. BRIN está diseñado para manejar tablas muy grandes en las que ciertas columnas tienen una correlación natural con su ubicación física dentro de la tabla. A rango de bloque es un grupo de páginas que son físicamente adyacentes en la tabla; para cada rango de bloques, el índice almacena información resumida. Por ejemplo, una tabla que almacena los pedidos de venta de una tienda puede tener una columna de fecha en la que se realizó cada pedido y, la mayoría de las veces, las entradas de pedidos anteriores también aparecerán antes en la tabla; una tabla que almacena una columna de código postal puede tener todos los códigos de una ciudad agrupados de forma natural.

Los índices BRIN pueden satisfacer consultas a través de escaneos regulares de índices de mapas de bits y devolverán todas las tuplas en todas las páginas dentro de cada rango si la información de resumen almacenada por el índice es consistente con las condiciones de consulta. El ejecutor de la consulta está a cargo de volver a verificar estas tuplas y descartar aquellas que no coinciden con las condiciones de la consulta; en otras palabras, estos índices tienen pérdidas. Debido a que un índice BRIN es muy pequeño, escanear el índice agrega poca sobrecarga en comparación con un escaneo secuencial, pero puede evitar escanear grandes partes de la tabla que se sabe que no contienen tuplas coincidentes.

Los datos específicos que almacenará un índice BRIN, así como las consultas específicas que el índice podrá satisfacer, dependen de la clase de operador seleccionada para cada columna del índice. Los tipos de datos que tienen un orden de clasificación lineal pueden tener clases de operadores que almacenan el valor mínimo y máximo dentro de cada rango de bloque, por ejemplo; los tipos geométricos pueden almacenar el cuadro delimitador para todos los objetos en el rango de bloques.

El tamaño del rango de bloques se determina en el momento de la creación del índice por el pages_per_range parámetro de almacenamiento. El número de entradas de índice será igual al tamaño de la relación en páginas dividido por el valor seleccionado para pages_per_range. Por lo tanto, cuanto más pequeño es el número, más grande se vuelve el índice (debido a la necesidad de almacenar más entradas de índice), pero al mismo tiempo, los datos de resumen almacenados pueden ser más precisos y se pueden omitir más bloques de datos durante una exploración de índice.

67.1.1. Mantenimiento de índices

En el momento de la creación, se escanean todas las páginas del montón existentes y se crea una tupla de índice de resumen para cada rango, incluido el rango posiblemente incompleto al final. A medida que las nuevas páginas se llenan de datos, los rangos de páginas que ya están resumidos harán que la información del resumen se actualice con datos de las nuevas tuplas. Cuando se crea una nueva página que no se encuentra dentro del último rango resumido, ese rango no adquiere automáticamente una tupla de resumen; esas tuplas permanecen sin resumir hasta que se invoca una ejecución de resumen más tarde, creando resúmenes iniciales. Este proceso se puede invocar manualmente usando el brin_summarize_range(regclass, bigint) o brin_summarize_new_values(regclass) funciones; automáticamente cuando VACUUM procesa la tabla; o por resumen automático ejecutado por autovacuum, a medida que ocurren las inserciones. (Este último disparador está deshabilitado por defecto y se puede habilitar con el autosummarize parámetro.) Por el contrario, un rango se puede de-resumir usando el brin_desummarize_range(regclass, bigint) función, que es útil cuando la tupla de índice ya no es una muy buena representación porque los valores existentes han cambiado.

Cuando el resumen automático está habilitado, cada vez que se completa un rango de páginas, se envía una solicitud a autovacuum para que ejecute un resumen específico para ese rango, que se completará al final de la próxima ejecución del trabajador en la misma base de datos. Si la cola de solicitudes está llena, la solicitud no se registra y se envía un mensaje al registro del servidor:

LOG:  request for BRIN range summarization for index "brin_wi_idx" page 128 was not recorded

Cuando esto suceda, el rango se resumirá normalmente durante el siguiente vacío regular de la mesa.

Anterior Arriba Próximo
Capítulo 67. Índices BRIN Casa 67.2. Clases de operadores integradas