
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

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

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

Yaroslav
11.08.2018
09:41:13

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
Мне там, кстати, в Вашей схеме ещё что-то не нравилось, я помню... но лучше снова посмотреть. :)

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

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

Yaroslav
11.08.2018
09:59:54

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

Yaroslav
11.08.2018
10:02:35

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

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
Из-за LIMIT не видно, сколько там всего rows по каждому из условий, вот в чём дело...

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
это все включая те сортировки и фильтрации что уже есть

Yaroslav
11.08.2018
10:26:36

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

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


Yaroslav
11.08.2018
10:55:39

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

Yaroslav
11.08.2018
11:00:02

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