Выбор ответа Senior Индексы обновлено

GIN для jsonb: jsonb_ops или jsonb_path_ops

Вопрос

Запросы к attrs jsonb только вида attrs @> '{"color": "red"}'. Чем индекс USING gin (attrs jsonb_path_ops) отличается от GIN по умолчанию?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Он меньше и быстрее для @, но не обслуживает ? (есть ли ключ). Класс по умолчанию jsonbops индексирует каждый ключ и каждое значение отдельно и поддерживает операторы существования ключа ?, ?, ?& вместе с @. jsonbpathops индексирует хеши путей до значений: индекс компактнее и точнее для проверки…

Варианты ответа

  1. jsonb_path_ops поддерживает больше операторов, включая проверку ключа ?
  2. Он меньше и быстрее для @>, но не обслуживает ? (есть ли ключ)правильный ответ
  3. Это B-tree индекс по всему JSON целиком, отсортированному по ключам
  4. Разницы нет: это синоним jsonb_ops, оставленный для совместимости

Разбор

Класс по умолчанию jsonb_ops индексирует каждый ключ и каждое значение отдельно и поддерживает операторы существования ключа ?, ?|, ?& вместе с @>. jsonb_path_ops индексирует хеши путей до значений: индекс компактнее и точнее для проверки вхождения @> (и JSONPath @?, @@), но вопрос «есть ли ключ» ему не по силам. Если нужно часто фильтровать по одному известному полю, бывает лучше обычный B-tree по выражению ((attrs->>'color')).

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.