linuxlab.io
Учебники▾
  • Линукс и сети
    Файловая система, процессы, TCP/IP, BGP и OSPF
    →
  • Terraform и IaC
    HCL, state, plan/apply на sandbox LocalStack
    →
  • Git и GitHub
    Объектная модель, plumbing, ветвление, GitHub Actions
    →
Все учебники →
ЦеныО платформеВойтиСоздать аккаунт
/
Intro
Lessons
Footer
linuxlab-УчебникиЦеныО платформеКонфиденциальность и куки
Copyright © 2026 LinuxLab. Все права защищены.
linuxlab.io
Учебники▾
  • Линукс и сети
    Файловая система, процессы, TCP/IP, BGP и OSPF
    →
  • Terraform и IaC
    HCL, state, plan/apply на sandbox LocalStack
    →
  • Git и GitHub
    Объектная модель, plumbing, ветвление, GitHub Actions
    →
Все учебники →
ЦеныО платформеВойтиСоздать аккаунт
/
  • Введение
  • Главы
  • How it worksскоро
  • Уроки
  • База знаний
  • Собеседование
home/postgres/kb/Индексы/gist-spgist

kb/indexes ── Индексы ── advanced

GiST и SP-GiST

GiST - каркас деревьев для пересечений, содержания и расстояний (&&, @>, <->): геометрия, диапазоны, exclusion constraint. SP-GiST делит пространство на непересекающиеся части (точки, IP, префиксы). Оба lossy.

view as markdownaka: gist, spgist, exclusion-constraint

Для данных без линейного порядка (прямоугольники, интервалы) B-tree не годится - нужны деревья с предикатами.

GiST

Обобщённое дерево поиска: узлы хранят предикат, покрывающий поддерево (например, bounding box у R-дерева). Поиск спускается только в ветви, чей предикат не противоречит запросу. Поддерживает && (пересечение), @> (содержит), <-> (расстояние, KNN). Качество дерева задают support-функции penalty (куда вставлять) и picksplit (как делить).

Exclusion constraint

sql
CREATE TABLE room_booking (
  room int,
  during tstzrange,
  EXCLUDE USING gist (room WITH =, during WITH &&)
);

Запрещает пересекающиеся брони одной комнаты - декларативный запрет двойного бронирования, опирается на GiST.

SP-GiST

Делит пространство на непересекающиеся части (quadtree для точек, radix-дерево для строк): спуск идёт в одну ветвь. Выгодно для точек, IP-сетей, префиксов строк. Деревья несбалансированные.

Lossy

Оба обычно lossy: индекс отбирает кандидатов по огрублённому описанию, а точное условие перепроверяется (Recheck Cond), поэтому Index-Only Scan недоступен. Какой оператор какой AM знает - в operator-classes. Инвертированный поиск по элементам - в gin-index.

§ команды

bash
CREATE INDEX ON t USING gist (range_col);

GiST по диапазону - для пересечений && и содержания

bash
CREATE INDEX ON t USING spgist (point_col);

SP-GiST для точек/IP/префиксов (непересекающееся разбиение)

§ см. также

  • operator-classesOperator classes и выбор индексаИндекс работает не «на колонке», а для конкретных операторов над ней. Связь тип+оператор+метод доступа задаёт operator class. Через каталог pg_amop можно узнать, какой AM поддерживает оператор: @> знают gin и gist, не btree.
  • gin-indexGIN: инвертированный индексGIN - инвертированный индекс для данных, где у строки много элементов: массивы, JSONB, полнотекст. Хранит «элемент → posting list из ctid». Быстр на чтение, дорог на запись; B-tree бессилен против LIKE '%x%', GIN решает.
  • index-designПроектирование индексовИндекс - отсортированный список. Составной (a,b,c) работает по префиксу слева направо, не по средней колонке. Покрывающие (INCLUDE), частичные (WHERE) и по выражению сужают работу; лишние индексы - налог на запись.
Footer
linuxlab-
Copyright © 2026 LinuxLab. Все права защищены.
Учебники
Цены
О платформе
Конфиденциальность и куки