BRIN ( Bloc Range In dex ) este o tehnică de indexare a datelor concepută pentru a procesa tabele mari [1] în care valoarea coloanei indexate are o oarecare corelație naturală cu poziția fizică a rândului în tabel . Au calități ale tabelelor partiționate precum inserarea rapidă a rândurilor, crearea rapidă a indexului, fără a fi nevoie să declare în mod explicit partițiile. [2]
Poate fi folosit pentru date geografice [3] , serii cronologice [4] , jurnalele sau istoricul comenzilor din magazin, care sunt scrise secvențial și, prin urmare, unele coloane (data, ora, număr) sunt deja parțial ordonate la nivel fizic și la nivel aceleași tabele de timp cu astfel de date cresc de obicei la dimensiuni gigantice. Accelerează operatorii de comparare, dar nu afectează interogările similare. [5] . BRIN nu este un index unic [6] și, prin urmare, nu poate fi utilizat ca index de cheie primară. [7]
Indicii BRIN au fost propuși pentru prima dată de Alvaro Herrera din 2ndQuadrant în 2013 sub numele „Indici Minmax”. Suportul a fost anunțat în PostgreSQL începând cu versiunea 9.5 [8] . Alte SGBD-uri au capabilități similare, inclusiv Oracle [9] [10] , Netezza ("hărți de zonă"), en:Infobright ("pachete de date"), en:MonetDBand , Apache Hive cu ORC/Parquet.
BRIN operează cu descrieri ale blocurilor mari de date, unde sunt stocate valorile minime și maxime ale coloanei indexate din bloc. În timpul solicitărilor, blocurile sunt filtrate mai întâi (condițiile de interogare sunt aplicate descrierii blocului). Astfel, pentru un număr mic de verificări, setul de date care va trebui verificat linie cu linie este redus. [unsprezece]
PostgreSQL DBMS stochează date în „pagini”, fiecare tabel sau index este o secvență de pagini. Dimensiunea standard a paginii este de 8 kiloocteți. [12] Un bloc sau un interval de blocuri este un grup de pagini (nu rânduri) care se succed într-un tabel. Blocul în acest caz face parte din index, nu din tabel: dimensiunea acestuia poate fi determinată în momentul în care indexul este creat cu parametrul pages_per_range. [13]
Pe măsură ce paginile sunt umplute cu date, informațiile de bloc sunt actualizate. Nu fiecare pagină corespunde unui bloc, este posibil ca paginile create recent să nu aibă un bloc (crearea de noi blocuri în index are loc, de exemplu, în timpul unei operațiuni VACUUMpe un tabel).
BRIN este atât de compact încât se poate încadra în totalitate în RAM, reducând numărul de operațiuni pe disc în timpul unei interogări. Acest lucru nu este întotdeauna valabil pentru indicii de arbore B, care au nevoie de un nod de arbore pentru aproximativ fiecare N rânduri de tabel, unde N este capacitatea unui nod. Dimensiunea unui index B-tree este semnificativă și poate fi comparabilă cu cantitatea de date din coloana tabelului indexat.