@pgsql

Страница 933 из 1062
Terminator
10.08.2018
17:04:50
@Sorjo будет жить. Поприветствуем!

@effrenus будет жить. Поприветствуем!

Ivan
10.08.2018
18:25:28
подскажите если у меня есть в поле hstore хэшик { "1" => "242", "2" => "52", "5" => "151", "6" => "" } - в нем ключи есть всегда а значений может не быть, как тогда найти количество хэшей где value = "" например у 6ого ключа

Terminator
11.08.2018
02:52:17
@wisemant будет жить. Поприветствуем!

Google
redl1ne
11.08.2018
03:36:26
Доброго времени суток Подскажите допустимо ли выражение ''' new.extract(month from date)'''

И если нет как его изменить в функции?

Yaroslav
11.08.2018
06:40:51
И если нет как его изменить в функции?
По идее, недопустимо... а откуда Вы его взяли?

Mike Chuguniy
11.08.2018
07:29:56
И если нет как его изменить в функции?
extract(month from new.date)? Но это первое, что пришло в голову, я не проверял.

redl1ne
11.08.2018
07:47:09
Да, уже решил, спасибо)

Terminator
11.08.2018
09:00:48
@Belyashick будет жить. Поприветствуем!

The
11.08.2018
09:39:58
Yaroslav в общем-то нагенерировал 3.2 млн. артикулов.

сделал ещё один индекс, т.к. вылетело из головы что FK в PostgreSQL не создает индекса.

Yaroslav
11.08.2018
09:40:30
Yaroslav в общем-то нагенерировал 3.2 млн. артикулов.
И что получилось? Какой размер базы? Вы настройки меняли, кстати?

The
11.08.2018
09:40:41
менял, коннекты поставил 50 и все

остальное такое-же

Yaroslav
11.08.2018
09:41:13
менял, коннекты поставил 50 и все
А ведь было же что-то ещё... ;) Так размер-то какой?

The
11.08.2018
09:41:25
и к слову поднимал до 8 гб и 4 ядер ресурсы (и конфиг тоже под неё), но разницы в производительности нету. сейчас гляну размер

Google
The
11.08.2018
09:42:35
2297 Мб

Yaroslav
11.08.2018
09:45:05
2297 Мб
Т.е. в память это должно влезать. Поднимите cpu_tuple_cost до 0.1, всё же. Затем, покажите актуальную схему и запрос(ы). :)

The
11.08.2018
09:45:15
я поднял уже

Yaroslav
11.08.2018
09:48:17
Мне там, кстати, в Вашей схеме ещё что-то не нравилось, я помню... но лучше снова посмотреть. :)

я поднял уже
Ах да, "VACUUM ANALYZE;" вы сделали?

The
11.08.2018
09:50:29
да, делал

Yaroslav
11.08.2018
09:51:02
да, делал
Ну так покажите схему и запросы. Можно без планов, пока.

The
11.08.2018
09:51:28
секунду

https://pastebin.com/ytr5HxUH

вот те таблицы которые фигурируют

Yaroslav
11.08.2018
09:54:31
Хорошо, дайте посмотрю...

The
11.08.2018
09:54:35
запрос: https://pastebin.com/RNjYEuZM explain: https://explain.depesz.com/s/HsLR

Yaroslav
11.08.2018
09:56:42
запрос: https://pastebin.com/RNjYEuZM explain: https://explain.depesz.com/s/HsLR
Зацепился, пока просматривал схему: created_at | timestamp without time zone Не делайте так. https://wiki.postgresql.org/wiki/Don%27t_Do_This#Don.27t_use_timestamp_.28without_time_zone.29

The
11.08.2018
09:59:27
спасибо за совет) прощелкал это

Yaroslav
11.08.2018
09:59:54
запрос: https://pastebin.com/RNjYEuZM explain: https://explain.depesz.com/s/HsLR
> ORDER BY spso.price LIMIT 30 Помните совет про недетерминированные запросы? ;)

The
11.08.2018
10:00:29
я помню, но не понимаю как мне избавиться. если я добавляю order by id в конце, тогда производительность проседает

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

или нужно составной индекс делать, price, sku_id?

Yaroslav
11.08.2018
10:02:35
я помню, но не понимаю как мне избавиться. если я добавляю order by id в конце, тогда производительность проседает
Ну а Вам в каком порядке нужно, если некоторые цены совпадают? От этого же зависит.

The
11.08.2018
10:03:22
честно говоря, скорее всего на shop_product_sku будет столбец вроде total_sales_last_month и по нему будет сортировка

Google
The
11.08.2018
10:03:32
или хотя б просто total_sales

ну тогда выборка не детерминированная тоже будет) вдруг и total_sales совпадет)

Yaroslav
11.08.2018
10:04:26
запрос: https://pastebin.com/RNjYEuZM explain: https://explain.depesz.com/s/HsLR
Ну ладно, отставим сортировку в сторону, пока что. И это план не от этого запроса. :) Так что покажите EXPLAIN (ANALYZE, BUFFERS) SELECT ...

The
11.08.2018
10:06:46
https://pastebin.com/raw/pyb2sSPP

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

Yaroslav
11.08.2018
10:08:57
А можете тот же запрос, но без "ORDER BY spso.price LIMIT 30" показать (интересно, сколько там всего по этим условиям, т.е. селективность индексов)?

The
11.08.2018
10:09:53
https://pastebin.com/hjPpbqZb

Yaroslav
11.08.2018
10:11:43
https://pastebin.com/hjPpbqZb
Эээ... без LIMIT.

Из-за LIMIT не видно, сколько там всего rows по каждому из условий, вот в чём дело...

вот, заново воспроизвел и запрос, и аналайз к нему как вы просили. там действительно чуть разные запросы были, прогнал
А давайте попробуем: CREATE INDEX ON public.shop_feature_brand_sku(feature_value_code, sku_id); CREATE INDEX ON public.shop_feature_cores_sku(feature_value_code, sku_id); CREATE INDEX ON public.shop_feature_ram_sku(feature_value_code, sku_id);

вот, заново воспроизвел и запрос, и аналайз к нему как вы просили. там действительно чуть разные запросы были, прогнал
И да, почему у Вас: SELECT sps.id, spso.price, sp.url -- spso.seller_id нет Хотя в shop_product_sku_offer PRIMARY KEY (sku_id, seller_id) Т.е. seller Вам тут не важен?

The
11.08.2018
10:22:37
щас, секунду)

The
11.08.2018
10:23:21
https://pastebin.com/K6Rqkj1y

вот без лимит и без ордер

Yaroslav
11.08.2018
10:24:12
вот без лимит и без ордер
Ага, спасибо, смотрю...

The
11.08.2018
10:25:24
по поводу seller, не совсем понял вопрос. вообще, в идеале хотелось бы так сделать: 1. выбрать все артикулы, где цены минимальная для каждого артикула (group by sps.id) order by min(spso.price) 2. и выбрать название селлера для этого артикула, shop_seller.name

это все включая те сортировки и фильтрации что уже есть

The
11.08.2018
10:27:01
ну потому что по нему тоже груп бай надо делать, или через аггрегацию брать FIRST() или как-то так, не помню точно

и запрос тогда получается супер медлительный

Google
The
11.08.2018
10:27:19
прям по 10 секунд)

Yaroslav
11.08.2018
10:29:26
И это будет совсем другой запрос, да. :) Эта штука примерно называется groupwise maximum, и для него в PostgreSQL есть 3 рабочих подхода: . LATERAL JOIN . DISTINCT ON . rCTE — но это в крайнем случае, т.к. выглядит страшно, и, по факту, workaround для отсуствия loose indexscan в PostgreSQL. ;)

Admin
ERROR: S client not available

The
11.08.2018
10:29:35
не придумал пока как написать запрос чтобы сгруппировать по артикулам, выбрать MIN(sps.price), и для него сответствующего селлера.

ну он может быть быстрым?

я могу сделать денормализацию и выкинуть min_price в shop_product_sku отдельным столбцом

но денормализацию хочу делать в самый последний момент

Yaroslav
11.08.2018
10:31:56
ну он может быть быстрым?
Может, см. выше. Дайте я Вам кое-что покажу (это я просто развлекался с написанием всех возможных способов): https://pastebin.com/wLs7w8aW

Естественно, по ссылке тоже лучше почитать. ;) И да, если кто-то покажет ещё какой-то способ (пофиг на производительность), буду благодарен. :)

я могу сделать денормализацию и выкинуть min_price в shop_product_sku отдельным столбцом
Эээ... только заметил, а как Вы собираетесь выбирать минимальную цену? У Вас валюты-то разные! ;)

The
11.08.2018
10:38:58
валюты одинаковые.

там есть задел на мультивалютность, но пока, вряд ли будет функционировать это все. поэтому пока одна валюта будет

Yaroslav
11.08.2018
10:40:25
А, я просто увидел вот это: shop_product_sku_offer.currency_code Короче говоря, лучше сначала написать правильный запрос, а потом уже с его производительностью разбираться.

The
11.08.2018
10:41:18
да, есть такое, это референс на таблицу с валютами, но пока всего будет одна валюта

честно говоря, ни совсем понимаю по поводу CTE, Lateral join и вижу это впервые. есть какая-то годная книжка?

ну cte юзал пару рас)

рекурсивно для выборки дерева категорий

но это такое.

Yaroslav
11.08.2018
10:43:35
Так вот... > Выбрать все артикулы, где цены минимальная для каждого артикула (group by sps.id) order by min(spso.price) Что конкретно значит? Вам нужны все товары с указанными свойствами, а уже по ним минимальные цены (30 штук)? Или же 30 товаров с указанными свойствами, по порядку возрастания минимальной цены среди selller-ов?

Google
The
11.08.2018
10:44:22
примеры то примеры, а понимания как это работает и когда использовать - нет.

Yaroslav
11.08.2018
10:44:32
А так, есть документация... по книгам не подскажу. :(

The
11.08.2018
10:47:05
мне нужно взять товары, для каждого из них может быть один или несколько селлеров, в идеале там будет цена retail и wholasale, я должен взять минимальную цену из wholasale (т.е. самую низкую цену на этот товар MIN(wholasale_price)), взять самую высокую розничную (MAX(retail_price)) и выбрать имя селлера с самой низкой ценой (тот который попал в MIN(wholasale_price)), и потом отсортировать по самой низкой wholasale_price, обрезать до 30 строк

как-то так

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

за paste спасибо, гляну)

я вас наверное уже запутал с этими ценами, и прочим)) просто структура четка не определена пока что, т.к. не совсем понимаю как её сделать правильно, а чтобы сделать правильно, нужно начать делать и по чуть чуть писать запросы, чтобы понимать какие есть трудности у такой структуры. поэтому приходиться двигаться змейкой)

The
11.08.2018
10:56:36
а кроме таймзон и uuid в целом структура нормальная?

Yaroslav
11.08.2018
11:00:02
а кроме таймзон и uuid в целом структура нормальная?
Да с виду ничего особо страшного пока нет. В shop_feature_brand_sku.feature_value_code NOT NULL забыли. ;)

The
11.08.2018
11:00:25
да, но на самом деле эти таблицы будут создаваться приложением.

на основании типа который используется

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