Index BRIN – Principe
La version 9.5 de PostgreSQL sortie en Janvier 2016 propose un nouveau type d’index : les Index BRIN pour Bloc Range INdex. Ces derniers sont recommandés pour les tables volumineuses et corrélées avec leur emplacement. J’ai décidé de consacrer une série d’article sur ces index :
- Index BRIN - Principe
- Index BRIN - Fonctionnement
- Index BRIN - Corrélation
- Index BRIN - Performances
Pour information, je serai présent au PGDay France à Lille le mardi 31 mai pour présenter cet index. Il y aura également plein d’autres conférences intéressantes!
Introduction
PostgreSQL propose déjà différents type d’index : B-Tree, GIN, GiST, SP-GiST, Hash 1
Les discussions ont commencées en 2008 : Segment Exclusion
Suivi de ce RFC en 2008 qui propose les « Minmax indexes » qui sera renommé plus tard en BRIN.
Physiquement, une table est composée de blocs de 8Ko et chaque bloc contient des enregistrements 2. L’idée des index BRIN est de stocker dans un index la valeur minimale et maximale d’un attribut d’un ensemble de bloc (range) 3. Ainsi il est possible d’exclure un ensemble de bloc si vous recherchez une valeur qui n’est pas comprise dans l’intervalle.
Note : Les index BRIN sont similaires aux storage indexes d’Oracle (Exadata Storage Indexes).
Voici les types supportés : Built-in Operator Classes
abstime
bigint
bit
bit varying
box
bytea
character
"char"
date
double precision
inet
inet
integer
interval
macaddr
name
numeric
pg_lsn
oid
any range type
real
reltime
smallint
text
tid
timestamp without time zone
timestamp with time zone
time without time zone
time with time zone
uuid
Il est également possible d’indexer plusieurs colonnes. Notez que la documentation actuelle ne le mentionne pas, c’est corrigé dans la version en cours de développement : Multicolumn Indexes
-
SELECT amname FROM pg_am;
ou encore http://www.postgresql.org/docs/current/static/indexes-types.html ↩︎ -
Si un enregistrement ne tient pas dans un bloc il est stocké séparément dans ce qu’on appelle le TOAST (The Oversized-Attribute Storage Technique). Plus exactement, si un enregistrement dépasse 2ko. ↩︎
-
L’index contient également deux booléens indiquant si l’ensemble contient des valeurs NULL (hasnulls ) ou s’il ne contient que des valeurs NULL (allnulls) ↩︎