Проверяет понимание GiST-индекса в PostgreSQL и его применения для нестандартных типов данных, что важно для оптимизации сложных запросов.
GiST (Generalized Search Tree) — это инфраструктура для построения сбалансированных деревьев поиска в PostgreSQL, которая позволяет создавать индексы для типов данных, не имеющих линейного порядка. В отличие от B-tree, где ключи сравниваются операторами <, =, >, GiST работает с предикатами, определёнными для конкретного типа. Например, для геометрических объектов предикат может проверять пересечение или вхождение.
GiST — это шаблон, а не готовый индекс. Разработчик типа данных реализует набор функций: consistent (проверка соответствия узла запросу), union (объединение ключей), compress, decompress, penalty, picksplit. На основе этих функций PostgreSQL строит дерево, где каждый узел содержит предикат, истинный для всех потомков. Поиск сводится к обходу дерева с проверкой предикатов.
Создадим таблицу с геометрическими точками и GiST-индекс:
CREATE TABLE places (id serial, name text, location point);
CREATE INDEX idx_places_location ON places USING gist (location);
-- Поиск точек в прямоугольнике
SELECT name FROM places
WHERE location <@ box '((0,0),(10,10))';
Для полнотекстового поиска:
CREATE TABLE docs (id serial, content tsvector);
CREATE INDEX idx_docs_content ON docs USING gist (content);
SELECT id FROM docs
WHERE content @@ to_tsquery('postgres & index');
GiST обычно медленнее B-tree для простых сравнений, но незаменим для сложных предикатов. Он поддерживает потерю точности (lossy), поэтому может возвращать ложные срабатывания, которые затем фильтруются. Для полнотекстового поиска часто предпочитают GIN, так как он быстрее для поиска по многим ключам, но GiST компактнее и быстрее обновляется.
GiST стоит применять, когда нужно индексировать данные с нелинейными отношениями: геометрия, диапазоны, полнотекстовый поиск, массивы. Если же требуется обычное равенство или сортировка, лучше использовать B-tree.