BRIN (від "Block Range Index") — призначена для обробки дуже великих таблиць, в яких певні стовпці мають деяку природну кореляцію з їх фізичним розташуванням в таблиці. Був запроваджений у версії PostgreSQL 9.5.
Вступ
На відміну від звичного B-tree (бінарного дерева), цей індекс набагато ефективніший для дуже великих таблиць, і в деяких ситуаціях дозволяє замінити собою перебірку. BRIN-індекс має сенс застосовувати для таблиць, в яких частина даних вже за своєю природою якось відсортована. Наприклад, це характерно для логів або для історії замовлень магазину, які пишуться послідовно, а тому вже на фізичному рівні впорядковані за датою / номером, і в той же час такі таблиці з такими даними зазвичай розростаються до гігантських розмірів.
Індекси BRIN можуть задовольняти запити за допомогою регулярних перевірок індексів бітових карт, і повертатимуть всі кортежі на всіх сторінках в межах кожного діапазону, якщо зведена інформація, що зберігається в індексі, узгоджується з умовами запиту. Виконавець запиту відповідає за повторну перевірку цих кортежів і відкидає ті, які не відповідають умовам запиту. Оскільки індекс BRIN має дуже малий розмір, сканування індексу додає невеликі накладні витрати в порівнянні з послідовним скануванням, але може уникнути сканування великих частин таблиці, які, як відомо, не містять співпадаючих кортежів.
Розмір діапазону блоків визначається під час створення індексу параметром сховища pages_per_range. Кількість записів індексу дорівнюватиме розміру відносин на сторінках, ділення на вибране значення для page_per_range. Таким чином, чим менше число, тим більше індекс, але в той же час зберігаються зведені дані можуть бути більш точними, і при індексуванні можна пропускати більше блоків даних.
Вбудовані класи операторів
Конкретні дані, які збережуть індекс BRIN, а також конкретні запити, які індекс зможе задовольнити, залежать від класу оператора, обраного для кожного стовпця індексу. Типи даних, що мають лінійний порядок сортування, можуть мати класи операторів, які зберігають, наприклад, мінімальне і максимальне значення в кожному діапазоні блоків; Геометричні типи можуть зберігати обмежує прямокутник для всіх об'єктів в діапазоні блоків.
Таблиця вбудованих класів операторів
Основний дистрибутив PostgreSQL включає класи операторів BRIN, які показані нижче в таблиці.
Назва | Індексований тип даних | Індексуємі оператори |
---|---|---|
abstime_minmax_ops | abstime | < <= = >= > |
int8_minmax_ops | bigint | < <= = >= > |
bit_minmax_ops | bit | < <= = >= > |
varbit_minmax_ops | bit varying | < <= = >= > |
box_inclusion_ops | box | << &< && &> >> ~= @> <@ &<| <<| |>> |&> |
bytea_minmax_ops | bytea | < <= = >= > |
bpchar_minmax_ops | character | < <= = >= > |
char_minmax_ops | "char" | < <= = >= > |
date_minmax_ops | date | < <= = >= > |
float8_minmax_ops | double precision | < <= = >= > |
inet_minmax_ops | inet | < <= = >= > |
network_inclusion_ops | inet | && >>= <<= = >> << |
int4_minmax_ops | integer | < <= = >= > |
interval_minmax_ops | interval | < <= = >= > |
macaddr_minmax_ops | macaddr | < <= = >= > |
name_minmax_ops | name | < <= = >= > |
numeric_minmax_ops | numeric | < <= = >= > |
pg_lsn_minmax_ops | pg_lsn | < <= = >= > |
oid_minmax_ops | oid | < <= = >= > |
range_inclusion_ops | any range type | << &< && &> >> @> <@ -|- = < <= = > >= |
float4_minmax_ops | real | < <= = >= > |
reltime_minmax_ops | reltime | < <= = >= > |
int2_minmax_ops | smallint | < <= = >= > |
text_minmax_ops | text | < <= = >= > |
tid_minmax_ops | tid | < <= = >= > |
timestamp_minmax_ops | timestamp without time zone | < <= = >= > |
timestamptz_minmax_ops | timestamp with time zone | < <= = >= > |
time_minmax_ops | time without time zone | < <= = >= > |
timetz_minmax_ops | time with time zone | < <= = >= > |
uuid_minmax_ops | uuid | < <= = >= > |
Технічне обслуговування індексів
Під час створення всі скановані сторінки індексу скануються і створюється зведений індексний кортеж для кожного діапазону, включаючи, можливо, неповний діапазон в кінці. Оскільки нові сторінки заповнюються даними, діапазони сторінок, які вже зведені, будуть приводити до оновлення зведеної інформації даними з нових кортежів. Коли створюється нова сторінка, що не потрапляє в останній підсумований діапазон, цей діапазон автоматично не отримує зведений кортеж; Ці кортежі залишаються немаркованими до тих пір, поки наступний цикл ущільнення не викликатиме пізніше, створюючи початкові зведення. Цей процес можна викликати вручну за допомогою функції brin_summarize_new_values (regclass) або автоматично, коли VACUUM обробляє таблицю.
Можливості до розширення
Інтерфейс BRIN має високий рівень абстракції, що вимагає реалізації методу доступу тільки для реалізації семантики типу даних, до якого здійснюється доступ. Рівень BRIN сам піклується про паралелізм, протоколювання і пошук структури індексу. Все, що потрібно для роботи з методом доступу BRIN, - це реалізувати кілька користувальницьких методів, які визначають поведінку зведених значень, що зберігаються в індексі, і то, як вони взаємодіють з ключами сканування. Коротше кажучи, BRIN поєднує розширюваність з загальними принципами, повторне використання коду і чистий інтерфейс.
Існує чотири методи, які операторський клас для BRIN повинен забезпечувати:
1)BrinOpcInfo * opcInfo (Oid type_oid)
Повертає внутрішню інформацію про зведених даних індексованих стовпців. Значення, що повертається повинно вказувати на palloc'd BrinOpcInfo, яка має наступне визначення:
typedef struct BrinOpcInfo { /* Number of columns stored in an index column of this opclass */ uint16 oi_nstored; /* Opaque pointer for the opclass' private use */ void *oi_opaque; /* Type cache entries of the stored columns */ TypeCacheEntry *oi_typcache[FLEXIBLE_ARRAY_MEMBER]; } BrinOpcInfo;
BrinOpcInfo.oi_opaque може використовуватися підпрограммами класу оператора для передачі інформації між допоміжними процедурами під час сканування індексу.
2)bool consistent(BrinDesc *bdesc, BrinValues *column, ScanKey key)
Повертає, чи узгоджує ScanKey з заданими індексованими значеннями діапазону. Номер атрибута, який слід використовувати, передається як частина ключа сканування.
3)bool addValue(BrinDesc *bdesc, BrinValues *column, Datum newval, bool isnull)
З огляду на індексний кортеж і індексовані значення, змінює вказаний атрибут кортежу так, щоб він додатково представляв нове значення. Якщо будь-яка модифікація була зроблена з кортежем, повертає true.
4)bool unionTuples(BrinDesc *bdesc, BrinValues *a, BrinValues *b)
Консолідація двох індексних кортежів. З урахуванням двох індексних кортежів, він змінює вказаний атрибут першого з них так, що він представляє обидва кортежа. Другий кортеж не змінюється.
Класи операторів, які реалізують абсолютно іншу семантику, також можливі за умови реалізації описаних вище чотирьох основних процедур підтримки. Зверніть увагу, що зворотна сумісність між основними випусками не гарантована: наприклад, в наступних випусках можуть знадобитися додаткові процедури підтримки.
Щоб написати операторний клас для типу даних, який реалізує повністю впорядковану множину, можна використовувати процедури підтримки minmax разом з відповідними операторами, як показано в таблиці нижче.
Член класу оператора | Об'єкт |
---|---|
Support Procedure 1 | внутрішня функція brin_minmax_opcinfo() |
Support Procedure 2 | внутрішня функція brin_minmax_add_value() |
Support Procedure 3 | внутрішня функція brin_minmax_consistent() |
Support Procedure 4 | внутрішня функція brin_minmax_union() |
Operator Strategy 1 | оператор менше-ніж |
Operator Strategy 2 | оператор менше-ніж-або-дорівнює |
Operator Strategy 3 | оператор дорівнює |
Operator Strategy 4 | оператор більше-ніж-або-дорівнює |
Operator Strategy 5 | оператор більше-ніж |
Посилання
https://www.postgresql.org/docs/manuals/ [ 6 червня 2017 у Wayback Machine.]
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
BRIN vid Block Range Index priznachena dlya obrobki duzhe velikih tablic v yakih pevni stovpci mayut deyaku prirodnu korelyaciyu z yih fizichnim roztashuvannyam v tablici Buv zaprovadzhenij u versiyi PostgreSQL 9 5 VstupNa vidminu vid zvichnogo B tree binarnogo dereva cej indeks nabagato efektivnishij dlya duzhe velikih tablic i v deyakih situaciyah dozvolyaye zaminiti soboyu perebirku BRIN indeks maye sens zastosovuvati dlya tablic v yakih chastina danih vzhe za svoyeyu prirodoyu yakos vidsortovana Napriklad ce harakterno dlya logiv abo dlya istoriyi zamovlen magazinu yaki pishutsya poslidovno a tomu vzhe na fizichnomu rivni vporyadkovani za datoyu nomerom i v toj zhe chas taki tablici z takimi danimi zazvichaj rozrostayutsya do gigantskih rozmiriv Indeksi BRIN mozhut zadovolnyati zapiti za dopomogoyu regulyarnih perevirok indeksiv bitovih kart i povertatimut vsi kortezhi na vsih storinkah v mezhah kozhnogo diapazonu yaksho zvedena informaciya sho zberigayetsya v indeksi uzgodzhuyetsya z umovami zapitu Vikonavec zapitu vidpovidaye za povtornu perevirku cih kortezhiv i vidkidaye ti yaki ne vidpovidayut umovam zapitu Oskilki indeks BRIN maye duzhe malij rozmir skanuvannya indeksu dodaye neveliki nakladni vitrati v porivnyanni z poslidovnim skanuvannyam ale mozhe uniknuti skanuvannya velikih chastin tablici yaki yak vidomo ne mistyat spivpadayuchih kortezhiv Rozmir diapazonu blokiv viznachayetsya pid chas stvorennya indeksu parametrom shovisha pages per range Kilkist zapisiv indeksu dorivnyuvatime rozmiru vidnosin na storinkah dilennya na vibrane znachennya dlya page per range Takim chinom chim menshe chislo tim bilshe indeks ale v toj zhe chas zberigayutsya zvedeni dani mozhut buti bilsh tochnimi i pri indeksuvanni mozhna propuskati bilshe blokiv danih Vbudovani klasi operatorivKonkretni dani yaki zberezhut indeks BRIN a takozh konkretni zapiti yaki indeks zmozhe zadovolniti zalezhat vid klasu operatora obranogo dlya kozhnogo stovpcya indeksu Tipi danih sho mayut linijnij poryadok sortuvannya mozhut mati klasi operatoriv yaki zberigayut napriklad minimalne i maksimalne znachennya v kozhnomu diapazoni blokiv Geometrichni tipi mozhut zberigati obmezhuye pryamokutnik dlya vsih ob yektiv v diapazoni blokiv Tablicya vbudovanih klasiv operatoriv Osnovnij distributiv PostgreSQL vklyuchaye klasi operatoriv BRIN yaki pokazani nizhche v tablici Nazva Indeksovanij tip danih Indeksuyemi operatoriabstime minmax ops abstime lt lt gt gt int8 minmax ops bigint lt lt gt gt bit minmax ops bit lt lt gt gt varbit minmax ops bit varying lt lt gt gt box inclusion ops box lt lt amp lt amp amp amp gt gt gt gt lt amp lt lt lt gt gt amp gt bytea minmax ops bytea lt lt gt gt bpchar minmax ops character lt lt gt gt char minmax ops char lt lt gt gt date minmax ops date lt lt gt gt float8 minmax ops double precision lt lt gt gt inet minmax ops inet lt lt gt gt network inclusion ops inet amp amp gt gt lt lt gt gt lt lt int4 minmax ops integer lt lt gt gt interval minmax ops interval lt lt gt gt macaddr minmax ops macaddr lt lt gt gt name minmax ops name lt lt gt gt numeric minmax ops numeric lt lt gt gt pg lsn minmax ops pg lsn lt lt gt gt oid minmax ops oid lt lt gt gt range inclusion ops any range type lt lt amp lt amp amp amp gt gt gt gt lt lt lt gt gt float4 minmax ops real lt lt gt gt reltime minmax ops reltime lt lt gt gt int2 minmax ops smallint lt lt gt gt text minmax ops text lt lt gt gt tid minmax ops tid lt lt gt gt timestamp minmax ops timestamp without time zone lt lt gt gt timestamptz minmax ops timestamp with time zone lt lt gt gt time minmax ops time without time zone lt lt gt gt timetz minmax ops time with time zone lt lt gt gt uuid minmax ops uuid lt lt gt gt Tehnichne obslugovuvannya indeksivPid chas stvorennya vsi skanovani storinki indeksu skanuyutsya i stvoryuyetsya zvedenij indeksnij kortezh dlya kozhnogo diapazonu vklyuchayuchi mozhlivo nepovnij diapazon v kinci Oskilki novi storinki zapovnyuyutsya danimi diapazoni storinok yaki vzhe zvedeni budut privoditi do onovlennya zvedenoyi informaciyi danimi z novih kortezhiv Koli stvoryuyetsya nova storinka sho ne potraplyaye v ostannij pidsumovanij diapazon cej diapazon avtomatichno ne otrimuye zvedenij kortezh Ci kortezhi zalishayutsya nemarkovanimi do tih pir poki nastupnij cikl ushilnennya ne viklikatime piznishe stvoryuyuchi pochatkovi zvedennya Cej proces mozhna viklikati vruchnu za dopomogoyu funkciyi brin summarize new values regclass abo avtomatichno koli VACUUM obroblyaye tablicyu Mozhlivosti do rozshirennyaInterfejs BRIN maye visokij riven abstrakciyi sho vimagaye realizaciyi metodu dostupu tilki dlya realizaciyi semantiki tipu danih do yakogo zdijsnyuyetsya dostup Riven BRIN sam pikluyetsya pro paralelizm protokolyuvannya i poshuk strukturi indeksu Vse sho potribno dlya roboti z metodom dostupu BRIN ce realizuvati kilka koristuvalnickih metodiv yaki viznachayut povedinku zvedenih znachen sho zberigayutsya v indeksi i to yak voni vzayemodiyut z klyuchami skanuvannya Korotshe kazhuchi BRIN poyednuye rozshiryuvanist z zagalnimi principami povtorne vikoristannya kodu i chistij interfejs Isnuye chotiri metodi yaki operatorskij klas dlya BRIN povinen zabezpechuvati 1 BrinOpcInfo opcInfo Oid type oid Povertaye vnutrishnyu informaciyu pro zvedenih danih indeksovanih stovpciv Znachennya sho povertayetsya povinno vkazuvati na palloc d BrinOpcInfo yaka maye nastupne viznachennya typedef struct BrinOpcInfo Number of columns stored in an index column of this opclass uint16 oi nstored Opaque pointer for the opclass private use void oi opaque Type cache entries of the stored columns TypeCacheEntry oi typcache FLEXIBLE ARRAY MEMBER BrinOpcInfo BrinOpcInfo oi opaque mozhe vikoristovuvatisya pidprogrammami klasu operatora dlya peredachi informaciyi mizh dopomizhnimi procedurami pid chas skanuvannya indeksu 2 bool consistent BrinDesc bdesc BrinValues column ScanKey key Povertaye chi uzgodzhuye ScanKey z zadanimi indeksovanimi znachennyami diapazonu Nomer atributa yakij slid vikoristovuvati peredayetsya yak chastina klyucha skanuvannya 3 bool addValue BrinDesc bdesc BrinValues column Datum newval bool isnull Z oglyadu na indeksnij kortezh i indeksovani znachennya zminyuye vkazanij atribut kortezhu tak shob vin dodatkovo predstavlyav nove znachennya Yaksho bud yaka modifikaciya bula zroblena z kortezhem povertaye true 4 bool unionTuples BrinDesc bdesc BrinValues a BrinValues b Konsolidaciya dvoh indeksnih kortezhiv Z urahuvannyam dvoh indeksnih kortezhiv vin zminyuye vkazanij atribut pershogo z nih tak sho vin predstavlyaye obidva kortezha Drugij kortezh ne zminyuyetsya Klasi operatoriv yaki realizuyut absolyutno inshu semantiku takozh mozhlivi za umovi realizaciyi opisanih vishe chotiroh osnovnih procedur pidtrimki Zvernit uvagu sho zvorotna sumisnist mizh osnovnimi vipuskami ne garantovana napriklad v nastupnih vipuskah mozhut znadobitisya dodatkovi proceduri pidtrimki Shob napisati operatornij klas dlya tipu danih yakij realizuye povnistyu vporyadkovanu mnozhinu mozhna vikoristovuvati proceduri pidtrimki minmax razom z vidpovidnimi operatorami yak pokazano v tablici nizhche Chlen klasu operatora Ob yektSupport Procedure 1 vnutrishnya funkciya brin minmax opcinfo Support Procedure 2 vnutrishnya funkciya brin minmax add value Support Procedure 3 vnutrishnya funkciya brin minmax consistent Support Procedure 4 vnutrishnya funkciya brin minmax union Operator Strategy 1 operator menshe nizhOperator Strategy 2 operator menshe nizh abo dorivnyuyeOperator Strategy 3 operator dorivnyuyeOperator Strategy 4 operator bilshe nizh abo dorivnyuyeOperator Strategy 5 operator bilshe nizhPosilannyahttps www postgresql org docs manuals 6 chervnya 2017 u Wayback Machine