172 похожих чатов

Всем привет. У меня есть таблица: CREATE TABLE (docid integer, attrs

jsonb);
где в attrs представляет собой:
{...
dates: ["2020-10-01", "2021-02-01"],
...
}
Такой запрос позволяет отобрать записи, старше 2020-10-02, но по плану исполнения запрос скатывается в SeqScan:
SELECT attrs FROM document_resinfo WHERE attrs @? '$.dates[*].datetime() ? (@ >= "2020-10-02".datetime())';

Вопрос: можно ли создать индекс по полю attrs, чтобы он работал в запросах подобного вида?

18 ответов

8 просмотров

а сейчас индекс есть, план запроса? Из вас все клещами надо тянуть? https://postgrespro.ru/docs/postgresql/14/datatype-json 8.14.4

Dmitry-Voronin Автор вопроса
Владимир
а сейчас индекс есть, план запроса? Из вас все кле...

EXPLAIN ANALYZE SELECT docid FROM document_resinfo WHERE attrs @? '$.odates[*].datetime() ? (@ >= "2020-10-02".datetime())'; QUERY PLAN ------------------------------------------------------------------------------------------------------------------- Seq Scan on test (cost=0.00..3784.12 rows=734 width=4) (actual time=39.792..47.341 rows=934 loops=1) Filter: (attrs @? '$."dates"[*].datetime()?(@ >= "2020-10-02".datetime())'::jsonpath) Rows Removed by Filter: 17236 Planning Time: 0.626 ms Execution Time: 47.406 ms (5 строк

Dmitry Voronin
EXPLAIN ANALYZE SELECT docid FROM document_resinfo...

индекс сейчас есть или нет по полю JSONB? Если есть какой?

Dmitry-Voronin Автор вопроса
Владимир
а сейчас индекс есть, план запроса? Из вас все кле...

Индекс пробовал создавать: CREATE INDEX test_idx ON test USING GIN (attrs jsonb_path_ops); CREATE INDEX test_idx ON document_resinfo USING GIN (attrs);

пиши даты в обычные поля. зачем этот json тут?

у вас здесь идет преобразование типов, обычные индексы так не работают.

Ровно в таком — не факт, если по смыслу в таком — то можно сделать функцыональный индэкс на оператор, который вытягивает min(dates).

Ilya Anfimov
Ровно в таком — не факт, если по смыслу в таком — ...

а потом еще один, и еще один, проще преобразовать и хранить в int виде и все будет работать

Владимир
модно, стильно, молодежно

ну тогда в чем вопрос? этого всего же вы достигли, а на использование индекса можно закрыть глаза

Dmitry-Voronin Автор вопроса
Alexey Bulgakov
пиши даты в обычные поля. зачем этот json тут?

Именно требуется произвести поиск записей по агрегированному условию по дат. Поскольку в jsonpath есть операторы datetime(), стало интересно, можно ли как-то это использовать.

Alexey Bulgakov
пардон :)

смотрел доклад Бартунова последний по JSONB, с оптимизацией TOAST, понравилась в конце фраза, что используя JSONB в таблице, делайте хотя бы doc_id вне json. :)

Dmitry Voronin
Именно требуется произвести поиск записей по агрег...

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

Dmitry Voronin
Именно требуется произвести поиск записей по агрег...

зачем вы навалили все в кучу **** и потом там роетесь? логично сделать нормальную структуру таблицы

Dmitry Voronin
Именно требуется произвести поиск записей по агрег...

Возможно вам вообще стоит хранить их как нормальные человеческие диапазоны https://postgrespro.ru/docs/postgresql/14/rangetypes#RANGETYPES-BUILTIN

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

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта