Hash-индекс - специализация под равенство, контраст к универсальному B-tree (см. btree-structure).
Устройство
| Страница | Роль |
|---|---|
| meta | число бакетов, маски |
| bucket | корзина под диапазон хешей |
| overflow | продолжение переполненного бакета |
| bitmap | учёт свободных overflow-страниц |
4-байтный хеш ключа определяет бакет; внутри - хеш-коды и ctid. Число
бакетов растёт линейным хешированием (постепенно, без разовой
перестройки).
История
До PostgreSQL 10 hash не писался в WAL - был небезопасен после сбоя и не реплицировался. С PG10 полноценно журналируется. Старый совет «не используй hash» - про эпоху до 10.
Чего не умеет
Только =. Никаких диапазонов (<, >), сортировки (ORDER BY),
многоколоночности и префиксного LIKE 'abc%' - порядок хеша не связан с
порядком значений (см. operator-classes).
Когда выбрать
Строго равенство по длинному ключу без потребности в порядке: hash хранит только хеш-коды и на длинных ключах компактнее B-tree. Во всех остальных случаях B-tree (см. index-design).
CREATE INDEX ON big USING hash (key);