@pgsql

Страница 676 из 1062
Сергей
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 работают только по нескольким операторам и не работаю с такими операторами как ">", "<" и так далее

могу ошибаться конечно просто сейчас не могу посмотреть инфу ?

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
JSON удобней, так как просто суешь свойство в объект, и попутно суешь свойство в глобальный объект свойств. Конечно, целостность сложно поддерживать, но лучше чем таблица на каждое свойство. Хотя пристально не рассматривал данный вариант, может и не плох в целом.
Насколько сильно с JSON(b) придётся мучаться, зависит от запросов (потребностей в поиске по нему) и распределения этих самых свойств. И поддержание ссылочной целостности — это тоже много.

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

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

чо вы тут устроили «я проверял но не помню»

Yaroslav
13.02.2018
21:49:08
всё норм индексируется, все ключи сразу
Да, но отсутствие статистики для индексированного JSONB — это совсем не "норм". Это значит, что планы строятся фактически наугад. :(

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

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
там есть SQL Fiddle, но в нем мало строк, может индекс вообще не будет юзаться. у меня где-то был генератор товаров на PostgreSQL
Причём здесь SQL Fiddle с тремя записями?! Там и GIN-индекса-то нет, кстати. ;) Планы на реальных данных, индексах, запросах есть?

The
13.02.2018
22:47:17
Причём здесь SQL Fiddle с тремя записями?! Там и GIN-индекса-то нет, кстати. ;) Планы на реальных данных, индексах, запросах есть?
Планы были когда я задавал вопрос на тостере. Сейчас запущу генератор товаров, и покажу в чем суть.

а не, не запущу. нету у меня того пакета который 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
И самих запросов, которые работают быстро, на тостере тоже нет... какие там условия были?
SELECT * FROM products WHERE (features-»'weight')::int < 20 AND features @> '{"color": ["red"]}' ORDER BY (features-»'weight')::int DESC LIMIT 100;

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
спасибо, почитаю
Да ещё учти что при использовании гин гист ничего не сортируй иначе иначе пг вытащит все данные которые нашёл и уже будет их сортировать

Сергей
14.02.2018
05:32:10
эм, можно пример с планом?
Order by разве работает по gin индексу?

Или по гист

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
Сергей
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
да я наврал

извини

не понял вопрос

гист должен ускорить поиск по значению

ну и в зависимости от класса там триграм поиск или поиск по вектору

Страница 676 из 1062