Задать вопрос

Есть ли какие-либо практические различия в PostgreSQL между доступом к jsonb через -> и []?

Здравствуйте.
В PostgreSQL существует два способа получить значение ключа jsonb.
SELECT ('{"a": [1, 2, 3]}'::jsonb) -> 'a';
SELECT ('{"a": [1, 2, 3]}'::jsonb)['a'];
Но есть ли действительно существенная разница между этими способами? Может скорость, может какие-нибудь подводные камни, может ещё что-нибудь?
И являются ли они взаимозаменяемыми? Особенно вопрос интересует относительно индексов.
CREATE INDEX "my_table_index1" ON "my_table" USING gin (("my_column" -> 'a'));

CREATE INDEX "my_table_index2" ON "my_table" USING gin (("my_column"['b']));

А потом посмотреть что же у нас получилось, то мы увидим:
"my_table_index1" gin ((my_column -> 'a'::text))
"my_table_index2" gin ((my_column['b'::text]))
Выходит, что с точки зрения PostgreSQL это, таки, совершенно разные вещи?
  • Вопрос задан
  • 228 просмотров
Подписаться 6 Средний Комментировать
Решения вопроса 1
Melkij
@Melkij
PostgreSQL DBA
Начну с конца - для индексов это критично разные вещи. Планировщик даже пытаться анализировать не станет, эквивалентные это условия или нет. Если у вас есть индекс по my_column -> 'a', а в запросе вы написали "my_column"['b'] - то этот индекс использоваться не будет.

Касательно самих двух операторов:
-> ровесник jsonb как такового
jsonb[element] - jsonb subscripting на языке документации - штука недавняя, лишь только прошлогодняя из pg14. Пока что нужно иметь в виду если вам может потребоваться более старая версия базы.
По поведению отличий вроде не должно быть никаких. Оба варианта возвращают jsonb, поэтому IRL куда чаще используется ->> возвращающий текст.
На уровне реализации оба приходят к одному и тому же getKeyJsonValueFromContainer. Вы скорее упрётесь в производительность разбора формата самого jsonb, чем заметите какую-то разницу в производительности родного оператора от type subscripting.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы