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 :

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 (4. Exadata Storage Indexes).

Voici les types supportés : Built-in Operator Classes

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

 

  1. SELECT amname FROM pg_am; ou encore http://www.postgresql.org/docs/current/static/indexes-types.html 
  2. 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.
  3. 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)
Share

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *