
Сергей
13.02.2018
18:41:00
возможно так херово делать ?

The
13.02.2018
18:45:39
я вешал gist вроде, или как-то так, в общем не запомнил, так как поставил postgres чтобы поиграться. нагенерировал 3 млн. товаров с фильтрами по json, и вот на интах фильтры не работали увы. тут вопрос вот в чем, допустим я хочу добавить в фильтр значение новое: "Емкость батареи mAh", после этого нужно идти и создавать индекс? Если бы был индекс по всем полям JSON, включая числовые, индекс бы сам перестроился - удобно же.

Сергей
13.02.2018
18:47:17
BTREE индекс ты явно указываешь .
GIN, GIST если не ошибаюсь по всем ключам работают.... я не могу сейчас в документацию залезть посмотреть .....

Google

Сергей
13.02.2018
18:48:31
но суть вот какая что GIN, GIST работают только по нескольким операторам и не работаю с такими операторами как ">", "<" и так далее
могу ошибаться конечно просто сейчас не могу посмотреть инфу ?

Yaroslav
13.02.2018
18:49:59
я вешал gist вроде, или как-то так, в общем не запомнил, так как поставил postgres чтобы поиграться. нагенерировал 3 млн. товаров с фильтрами по json, и вот на интах фильтры не работали увы. тут вопрос вот в чем, допустим я хочу добавить в фильтр значение новое: "Емкость батареи mAh", после этого нужно идти и создавать индекс? Если бы был индекс по всем полям JSON, включая числовые, индекс бы сам перестроился - удобно же.
Даже если бы они работали, всё это индексирование в стиле "авось повезёт", IMHO.
А Вам это зачем?

The
13.02.2018
18:50:47
фильтры каталога
товары и прочее.
чтобы не делать EAV

Yaroslav
13.02.2018
18:51:59
А нормализованную модель нельзя сделать?
Всё равно с EAV и аналогами Вы будете страдать, хотя с аналогами поменьше. :(

The
13.02.2018
18:53:33
нормализованную модель, вы имеете ввиду прямо в табличке хранить столбцы со значениями?
или как?
я знаю пока три способа организации фильтров:
- EAV
- JSONB
- прямо в табличке рядом хранить
- ну и оставшиеся варианты с битовыми масками Redis и прочим, но основных все же три

Yaroslav
13.02.2018
18:58:45
. Flat table (т.е. в той же (соседней / по группам) таблице NULL-able поля).
. Отдельная таблица для каждого.

The
13.02.2018
19:16:58
JSON удобней, так как просто суешь свойство в объект, и попутно суешь свойство в глобальный объект свойств. Конечно, целостность сложно поддерживать, но лучше чем таблица на каждое свойство. Хотя пристально не рассматривал данный вариант, может и не плох в целом.

Yaroslav
13.02.2018
19:20:29

Google

Yaroslav
13.02.2018
19:21:52
И ещё зависит от количества этих свойств товаров, и того, как часто добавляются новые, конечно.

Evgeniy
13.02.2018
21:00:20
всё норм индексируется, все ключи сразу
чо вы тут устроили «я проверял но не помню»

Yaroslav
13.02.2018
21:49:08

Evgeniy
13.02.2018
22:11:34
jsquery юзать
если план говно, пиши в пгпро

The
13.02.2018
22:13:21
вот я задавал вопрос 11 декабря
с того момента что-то разве изменилось?

Yaroslav
13.02.2018
22:17:21

The
13.02.2018
22:19:34
проблема вот в чем, когда ты пишешь например features->>'brand' = 'Samsung' выполняется мгновенно. когда пишешь features->>battery = 3000 то уже долго.

Evgeniy
13.02.2018
22:30:02
это проблема плана или селективности и доступа к страничкам?

Ascandar
13.02.2018
22:31:11
а чего может быть зависон
INFO: wait for WAL segment /postgre/back/wal/rshn/00000001000000010000002C to be archived
?
висит так 5 минут и отваливается
это probackup
ERROR: switched WAL segment 00000001000000010000002C could not be archived in 300 seconds
LOG: Backup is running, update its status to ERROR

Yaroslav
13.02.2018
22:37:00

The
13.02.2018
22:39:13
там есть SQL Fiddle, но в нем мало строк, может индекс вообще не будет юзаться. у меня где-то был генератор товаров на PostgreSQL

Ascandar
13.02.2018
22:40:38
про зависон вопрос отпал, решение простое было, PATH указать для pg_probackup и рестарт бд

Google

Yaroslav
13.02.2018
22:42:42

The
13.02.2018
22:47:17
а не, не запущу. нету у меня того пакета который json генерирует. тут просто рандом с картинками ценами и т.д.

Yaroslav
13.02.2018
22:51:44

bebebe
13.02.2018
23:30:10
хочу странного:
каким образом одно и то же значаение из таблицы вернуть в двух "столбца"
типа
select some_long_func(A) AS result, some_long_func(A) AS value FROM bigtable
два раза ведь будет считаться some_long_func?
каким образом можно вернуть результат some_long_func(A) в "двух полях" - result и value, но высчитывая это значение один раз

The
13.02.2018
23:33:49
QUERY PLAN
-----------------------------------------------------------------------------------------------------------------------
Limit (cost=8889.20..8889.35 rows=60 width=212)
-> Sort (cost=8889.20..8889.35 rows=60 width=212)
Sort Key: (((features ->> 'weight'::text))::integer) DESC
-> Seq Scan on products (cost=0.00..8887.43 rows=60 width=212)
Filter: ((features @> '{"color": ["red"]}'::jsonb) AND (((features ->> 'weight'::text))::integer < 20))
(5 rows)
в таблице 179к строк
запрос за 63 мс.
здесь используются индексы?
сейчас индекс BTREE вроде
одну секунду. гляну
"products_features_idx" btree (features)

Evgeniy
13.02.2018
23:41:48
ну надеюсь ты сам себе на всё ответил
начиная с 63мс
и 60 строк

The
13.02.2018
23:43:28
пока не особо, если честно. я не очень умею читать query plan у постгрес
я ж говорю, ставил чтобы поиграться.

Google

The
13.02.2018
23:44:58
я не могу сейчас воспроизвести ту проблему
возможно я без where запрос запускал
но прямо вот заметно дольше запрос думал, когда с числом начинал работать
ну и человек в том вопросе ответил как-то не однозначно, Больше возможностей внятно индексировать jsonb для запросов на числовые диапазоны мне как-то не вспоминается.

Evgeniy
13.02.2018
23:47:17
почитай пожалуйста про jsquery и индексную поддержку его диалекта
запрос который ты приводишь не покрывается btree индексом
и печально покрывается gin тоже
на тему жсона и индексов к нему реально нет специалистов лучше пгпро

The
13.02.2018
23:49:08
спасибо, почитаю

Evgeniy
13.02.2018
23:49:10
поэтому если что, к ним

pew
14.02.2018
01:52:48
жесть

Сергей
14.02.2018
05:04:32
спасибо, почитаю
Да ещё учти что при использовании гин гист ничего не сортируй иначе иначе пг вытащит все данные которые нашёл и уже будет их сортировать

Darafei
14.02.2018
05:31:36

Сергей
14.02.2018
05:32:10
Или по гист

Darafei
14.02.2018
05:32:26
по гист работает и даже ускоряет
в gin глубоко не копал, за гист зуб даю :)

Сергей
14.02.2018
05:33:17
Доеду до офиса проверю ещё раз.

Darafei
14.02.2018
05:33:40
просто, может, у тебя по твоему выражению сортировки лишний btree подхватился

Yaroslav
14.02.2018
06:31:55
здесь используются индексы?
Нет, не используются совсем.
И GIN вообще не может быть использован в этом запросе, см.:
https://www.postgresql.org/docs/current/static/datatype-json.html#JSON-INDEXING

Google

Yaroslav
14.02.2018
06:35:02


Сергей
14.02.2018
07:48:01
@Komzpa
create table if not exists test
(
a text
);
CREATE INDEX foo_idx ON test USING GIST (a);
EXPLAIN ANALYZE SELECT * FROM test ORDER BY a DESC LIMIT 100;
QUERY PLAN
Limit (cost=26322.69..26322.94 rows=100 width=32) (actual time=4343.751..4344.697 rows=100 loops=1)
-> Sort (cost=26322.69..27572.69 rows=500001 width=32) (actual time=4343.740..4344.056 rows=100 loops=1)
Sort Key: a DESC
Sort Method: top-N heapsort Memory: 34kB
-> Seq Scan on test (cost=0.00..7213.01 rows=500001 width=32) (actual time=0.020..2113.605 rows=500001 loops=1)
Planning time: 0.085 ms
Execution time: 4345.048 ms
вставил бы скриншот но прав не имею таких ?
в таблице 100000 записей
числа от 0 до 99999
ну в виде текста естественно

Darafei
14.02.2018
07:59:10
В таблице 500001 запись
А гистовый опкласс которую часть запроса обещал ускорять?

Сергей
14.02.2018
08:00:32
да я наврал
извини
не понял вопрос
гист должен ускорить поиск по значению
ну и в зависимости от класса там триграм поиск или поиск по вектору