powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / работа с json-индексами
17 сообщений из 17, страница 1 из 1
работа с json-индексами
    #38941834
deadka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток!

Есть таблица t, в которой много записей, несколько миллионов.
В ней есть поле d типа json (jsonb пока, увы, низя использовать).
В очень малом количестве записей в поле d лежит неNULL'овое значение,
еще в меньшем количестве записей в поле d есть ключ f.

Код: plsql
1.
2.
3.
create table if not exists t(id bigserial, d json);
INSERT INTO t(d) SELECT NULL FROM generate_series(1,1000000) i;
update t set d = '{"f":"val"}' WHERE id = 999999;


Собственно, задача быстро найти те записи, в которых есть этот ключ f.

Пробовал созданием индекса
CREATE INDEX json_simple_idx ON t((d->>'f'));

запрос
explain select * from t where (d->>'f') = 'val'
показывает Bitmap Index Scan

но мне куда более подходит запрос
select * from t where (d->>'f') is not null;
а у него seq scan и работает куда как медленнее.

Прошу подсказать - можно ли как-то в рамках моей задачи использовать json-индекс или другим путем идти нужно (если так, то каким?)
...
Рейтинг: 0 / 0
работа с json-индексами
    #38941837
tadmin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
deadka,

Код: plsql
1.
CREATE INDEX json_simple_idx ON t((d->>'f')) where d is not null;
...
Рейтинг: 0 / 0
работа с json-индексами
    #38941849
deadka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как-то не полегчало (.

Код: plsql
1.
2.
3.
4.
5.
create table if not exists t1(id bigserial, d json);
truncate t1;
INSERT INTO t1(d) SELECT NULL FROM generate_series(1,1000000) i;
update t1 set d = '{"f":"val"}' WHERE id = 999999;
CREATE INDEX json_simple_idx11 ON t1((d->>'f')) where d is not null;



explain select * from t1 where (d->>'f') is not null;
выдал

"Seq Scan on t1 (cost=0.00..16925.00 rows=995000 width=40)"
" Filter: ((d ->> 'f'::text) IS NOT NULL)"
...
Рейтинг: 0 / 0
работа с json-индексами
    #38941902
tadmin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Однако!
...
Рейтинг: 0 / 0
работа с json-индексами
    #38941930
p2.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
deadka,

не сложно догадаться написать where индекса такое же, как запроса.
...
Рейтинг: 0 / 0
работа с json-индексами
    #38941935
Alexius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
deadka,

интересные дела, для json полей статистика оказывается вообще не собирается .
без нее постгрес не знает сколько записей отберется по условию и предполагает, что выкидывается 0.5% что конечно не так. нужны дополнительные ухищрения чтобы заставить использовать индекс (например можно сортировку по нему указать).

для jsonb такой проблемы нет, но все равно нужно явно в условии дополнительно указывать and d is not null, чтобы работало.
...
Рейтинг: 0 / 0
работа с json-индексами
    #38941961
deadka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
p2.не сложно догадаться написать where индекса такое же, как запроса.

Создал
Код: plsql
1.
CREATE INDEX json_simple_idx2 ON t((d->>'f')) where (d->>'f') is not null;



explain select * from t where (d->>'f') is not null;
дал тот же seq scan
...
Рейтинг: 0 / 0
работа с json-индексами
    #38941993
deadka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alexiusdeadka,

интересные дела, для json полей статистика оказывается вообще не собирается .
без нее постгрес не знает сколько записей отберется по условию и предполагает, что выкидывается 0.5% что конечно не так. нужны дополнительные ухищрения чтобы заставить использовать индекс (например можно сортировку по нему указать).

для jsonb такой проблемы нет, но все равно нужно явно в условии дополнительно указывать and d is not null, чтобы работало.

Alexius,

спасибо за ответ!

В случае сортировки - помогает.
Код: plsql
1.
explain select * from t where (d->>'f') is not null ORDER BY d->>'f';


"Index Scan using json_simple_idx4 on ..."

причем что с индексом
Код: plsql
1.
CREATE INDEX json_simple_idx4 ON t4((d->>'f')) WHERE (d->>'f') is not null;


что с индексом без where
Код: plsql
1.
CREATE INDEX json_simple_idx4 ON t4((d->>'f'));


explain получается одинаковый. Это как-то объяснимо?
...
Рейтинг: 0 / 0
работа с json-индексами
    #38942041
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
deadka,

Мысли вслух: если требуется отбор, сортировка или группировка по значению из композитного типа данных, то такое значение следует вынести в отдельную колонку…
...
Рейтинг: 0 / 0
работа с json-индексами
    #38942147
Alexius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
deadka,

explain тут и должен быть одинаковый. речь шла про то, что условие в where частичного индекса почти всегда должно присутствовать в явном виде в where запроса, чтобы он использовался. а ранее условия были разные (where d is not null и where (d->>'f') is not null).
...
Рейтинг: 0 / 0
работа с json-индексами
    #38942740
deadka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vyegorovdeadka,

Мысли вслух: если требуется отбор, сортировка или группировка по значению из композитного типа данных, то такое значение следует вынести в отдельную колонку…

Помыслил ). Встречные мысли вслух: если в таблице очень много записей, и лишь у малого количества записей встречается такой аттрибут - то делать для него столбец и заполнять NULL'ами в 99% случаев - то не жирно ли?.. Композитные типы данных разве не для такого (в том числе) случая создали?
...
Рейтинг: 0 / 0
работа с json-индексами
    #38942741
deadka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alexiusdeadka,

explain тут и должен быть одинаковый. речь шла про то, что условие в where частичного индекса почти всегда должно присутствовать в явном виде в where запроса, чтобы он использовался. а ранее условия были разные (where d is not null и where (d->>'f') is not null).

Alexius, спасибо за ответ!
...
Рейтинг: 0 / 0
работа с json-индексами
    #38942814
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
deadkaВстречные мысли вслух: если в таблице очень много записей, и лишь у малого количества записей встречается такой аттрибут - то делать для него столбец и заполнять NULL'ами в 99% случаев - то не жирно ли?.. Композитные типы данных разве не для такого (в том числе) случая создали?
Как я понял по вопросу, для вас такие записи важны. Нормализуйте схему — создайте связанную таблицу для нужных значений и привязывайтесь к ней по необходимости.
...
Рейтинг: 0 / 0
работа с json-индексами
    #38942832
Alexius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
deadka,

оба варианта в данном случае хороши (с частичным функциональным индексом и с отдельным полем с индексом).

по размеру отдельное поле с индексом будет раза в 2 больше места занимать, но сами null'ы ничего не стоят (они все хранятся в битовой маске, если в таблице менее 8 nullable полей - то это 1 лишний байт на каждую строку, который и так есть). из плюсов - на это поле уже будет статистика, если например нужно будет с какой-то таблицей по этому полю join сделать (или по другому полю, но важно правильно знать число строк) - это поможет.
из минусов помимо размера еще необходимость поддерживать поле в актуальном состоянии (например, триггером).

обычно индекса достаточно, но для json полей какие-то запросы придется поправить, где-то может быть не очень очевидным путем.
...
Рейтинг: 0 / 0
работа с json-индексами
    #38942835
deadka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vyegorovdeadkaВстречные мысли вслух: если в таблице очень много записей, и лишь у малого количества записей встречается такой аттрибут - то делать для него столбец и заполнять NULL'ами в 99% случаев - то не жирно ли?.. Композитные типы данных разве не для такого (в том числе) случая создали?
Как я понял по вопросу, для вас такие записи важны. Нормализуйте схему — создайте связанную таблицу для нужных значений и привязывайтесь к ней по необходимости.
Согласен, вариант. Но для каждого такого аттрибута по таблице заводить.. Плюс не вполне понятно, что подразумевается под "важностью" данных :). Какие данные Вы подразумеваете под неважными, чтобы можно из было в композитном типе хранить?
...
Рейтинг: 0 / 0
работа с json-индексами
    #38942839
deadka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alexiusdeadka,

оба варианта в данном случае хороши (с частичным функциональным индексом и с отдельным полем с индексом).

по размеру отдельное поле с индексом будет раза в 2 больше места занимать, но сами null'ы ничего не стоят (они все хранятся в битовой маске, если в таблице менее 8 nullable полей - то это 1 лишний байт на каждую строку, который и так есть). из плюсов - на это поле уже будет статистика, если например нужно будет с какой-то таблицей по этому полю join сделать (или по другому полю, но важно правильно знать число строк) - это поможет.
из минусов помимо размера еще необходимость поддерживать поле в актуальном состоянии (например, триггером).

обычно индекса достаточно, но для json полей какие-то запросы придется поправить, где-то может быть не очень очевидным путем.

Alexius, честно говоря думал, что редко появляющееся значение - просто идеальный кандидат для того, чтобы в композитное поле его положить. Если нет, то для каких же данных предназначен json/jsonb? Для тех, по которым нет нужды индексы использовать?
...
Рейтинг: 0 / 0
работа с json-индексами
    #38942853
Alexius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
deadkaAlexius, честно говоря думал, что редко появляющееся значение - просто идеальный кандидат для того, чтобы в композитное поле его положить. Если нет, то для каких же данных предназначен json/jsonb? Для тех, по которым нет нужды индексы использовать?

наверное для тех, которые нельзя положить в массивы и hstore.
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / работа с json-индексами
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]