BRIN

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску

BRIN (от англ. Block Range Index) — техника индексации данных, предназначенная для обработки больших[1] таблиц, в которых значение индексируемого столбца имеет некоторую естественную корреляцию с физическим положением строки в таблице. Они обладают такими качествами партиционированных таблиц, как быстрая вставка строки, быстрое создание индекса, без необходимости явного объявления партиций.[2]

Может использоваться для географических данных[3], временных рядов[4], логов или истории заказов магазина, которые пишутся последовательно, а потому некоторые колонки (дата, время, номер) частично упорядочены уже на физическом уровне, и в то же время таблицы с такими данными обычно разрастаются до гигантских размеров. Ускоряет операторы сравнения, но не влияет на like-запросы.[5]. BRIN — не уникальный индекс[6], поэтому не может использоваться в качестве индекса первичного ключа.[7]

BRIN-индексы были впервые предложены Alvaro Herrera из компании 2ndQuadrant в 2013 году под названием «Minmax-индексы». Поддержка была заявлена в PostgreSQL с версии 9.5[8]. В других СУБД есть похожие возможности, в том числе в Oracle[9][10], Netezza («zone maps»), en:Infobright («data packs»), en:MonetDBand, Apache Hive с ORC/Parquet.

Архитектура[править | править код]

Структура индекса B-tree
Структура индекса BRIN

BRIN оперирует описаниями больших блоков данных, где хранится минимальное и максимальное значение индексируемого столбца внутри блока. Во время запросов сначала фильтруются блоки (условия запроса применяется к описанию блока). Таким образом, за небольшое число проверок сокращается набор данных, которые надо будет проверять построчно.[11]

СУБД PostgreSQL хранит данные в «страницах», каждая таблица или индекс — это последовательность страниц. Стандартный размер страницы — 8 килобайт.[12] Блок или блоковый диапазон (англ. «a block range») — это группа страниц (а не строк), которые идут друг за другом в таблице. Блок в данном случае — часть индекса, а не таблицы: его размер можно определить в момент создания индекса параметром pages_per_range.[13]

По мере того, как страницы наполняются данными, информация о блоках обновляется. Не каждой странице соответствует блок, недавно созданные страницы могут не иметь блока (создание новых блоков в индексе происходит, например, во время операции VACUUM на таблице).

BRIN настолько компактный, что может помещаться целиком в оперативную память, уменьшая количество дисковых операций во время запроса. Это не всегда справедливо для индексов B-tree, которые нуждаются в узле дерева на приблизительно каждые N строк таблицы, где N — вместимость одного узла. Размер индекса B-tree значителен и может быть сопоставим с объёмом данных в индексируемой колонке таблицы.

См. также[править | править код]

  • GiST — индекс для like-запросов.
  • Gin — еще один индекс для like-запросов. Он в 3 раза медленнее обновляется, чем GiST, но в 3 раза быстрее находит данные.[14]

Примечания[править | править код]

  1. Больших в смысле количества строк, а не размера полей или абсолютного размера таблицы в байтах.
  2. Mark Wong. Loading Tables and Creating B-tree and Block Range Indexes. AXLE project (October 10, 2014).
  3. https://2016.foss4g-na.org/sites/default/files/slides/gbroccolo_FOSS4GNA_PGDay2016_brin4postgis.pdf
  4. BRIN indexes, what are they and how do you use them?
  5. Table 62-1. Built-in BRIN Operator Classes
  6. When should I use BRIN indexes? : PostgreSQL
  7. How to promote an existing index to primary key in PostgreSQL - Database Administrators Stack Exchange
  8. PostgreSQL: Documentation: 9.5: Release 9.5
  9. Arup Nanda (May–June 2011). “Smart Scans Meet Storage Indexes”. Oracle Magazine. Oracle.
  10. Oracle Sun Database Machine Application Best Practices for Data Warehousing. Oracle.
  11. commitdiff - BRIN: Block Range Indexes. git.postgresql.org (7 November 2014). Дата обращения 3 октября 2017.
  12. PostgreSQL: Documentation: 8.0: Database Page Layout
  13. PostgreSQL: Documentation: 9.5: Introduction
  14. Difference between GiST and GIN index. stackoverflow.com. Дата обращения 11 апреля 2018.

Ссылки[править | править код]