BRIN ( Block Range Index ) es una técnica de indexación de datos diseñada para procesar tablas grandes [1] en las que el valor de la columna indexada tiene una correlación natural con la posición física de la fila en la tabla . Tienen tales cualidades de tablas particionadas como la inserción rápida de filas, la creación rápida de índices, sin la necesidad de declarar particiones explícitamente. [2]
Se puede utilizar para datos geográficos [3] , series temporales [4] , logs o historial de pedidos de tiendas, que se escriben secuencialmente, y por tanto algunas columnas (fecha, hora, número) ya están parcialmente ordenadas a nivel físico, y a nivel Las mismas tablas de tiempo con tales datos generalmente crecen a tamaños gigantescos. Acelera los operadores de comparación, pero no afecta a las consultas similares. [5] . BRIN no es un índice único [6] y, por lo tanto, no se puede utilizar como índice de clave principal. [7]
Los índices BRIN fueron propuestos por primera vez por Álvaro Herrera de 2ndQuadrant en 2013 bajo el nombre de "índices Minmax". El soporte ha sido anunciado en PostgreSQL desde la versión 9.5 [8] . Otros DBMS tienen capacidades similares, incluidos Oracle [9] [10] , Netezza ("mapas de zona"), en:Infobright ("paquetes de datos"), en:MonetDBand , Apache Hive con ORC/Parquet.
BRIN opera con descripciones de grandes bloques de datos, donde se almacenan los valores mínimos y máximos de la columna indexada dentro del bloque. Durante las solicitudes, los bloques se filtran primero (las condiciones de consulta se aplican a la descripción del bloque). Por lo tanto, para un pequeño número de comprobaciones, se reduce el conjunto de datos que será necesario comprobar línea por línea. [once]
PostgreSQL DBMS almacena datos en "páginas", cada tabla o índice es una secuencia de páginas. El tamaño de página estándar es de 8 kilobytes. [12] Un bloque o rango de bloques es un grupo de páginas (no filas) que se suceden en una tabla. El bloque en este caso es parte del índice, no de la tabla: su tamaño se puede determinar en el momento de crear el índice con el parámetro pages_per_range. [13]
A medida que las páginas se llenan de datos, la información del bloque se actualiza. No todas las páginas corresponden a un bloque, las páginas creadas recientemente pueden no tener un bloque (la creación de nuevos bloques en el índice ocurre, por ejemplo, durante una operación VACUUMen una tabla).
BRIN es tan compacto que cabe completamente en la RAM, lo que reduce la cantidad de operaciones de disco durante una consulta. Esto no siempre es cierto para los índices de árbol B, que necesitan un nodo de árbol para aproximadamente cada N filas de la tabla, donde N es la capacidad de un nodo. El tamaño de un índice de árbol B es significativo y puede compararse con la cantidad de datos en la columna de la tabla indexada.