Size: a a a

pgsql – PostgreSQL

2020 June 13

2_

2flower _ in pgsql – PostgreSQL
Tagil Steel
У нас не принято объяснять бизнесу что то, что они хотят, им на самом деле не нужно, так как это не позволяет парадигма программирования.
т.е. это бизнес вам говорит делать такую структуру и такие запросы? хммм...
источник

Ð

Ð in pgsql – PostgreSQL
если дубли появляются из-за джойна каталогов с отношением многие ко многим, явно что-то не так. Нужна нормальная декомпозиция и разделение этого запроса на ряд более простых
источник

TS

Tagil Steel in pgsql – PostgreSQL
Yaroslav Schekin
Может, стоило это пытаться решить (т.е. выявить причину низкой производительности и устранить)?
Причина в том, что PG на каждом уровне вложенности делает временную таблицу. А это получается не быстро. По крайней мере по сравнению с реализацией агрегата на С.
Кроме того, двухуровневые запросы с четко поделенными функциями на мой взгляд понятнее. Ведь суммарно отчетов очень много - несколько десятков, они периодически улучшаются(путем добавления показателей), и числота тоже имеет значение. У нас 3 кастомные функции, котрые легки в понимании, а дальше все стандартно, и всего в 2 уровня.
источник

Ð

Ð in pgsql – PostgreSQL
Tagil Steel
Причина в том, что PG на каждом уровне вложенности делает временную таблицу. А это получается не быстро. По крайней мере по сравнению с реализацией агрегата на С.
Кроме того, двухуровневые запросы с четко поделенными функциями на мой взгляд понятнее. Ведь суммарно отчетов очень много - несколько десятков, они периодически улучшаются(путем добавления показателей), и числота тоже имеет значение. У нас 3 кастомные функции, котрые легки в понимании, а дальше все стандартно, и всего в 2 уровня.
а проверка существования элемента в массиве, жсон и жсон пас в агрегате, это значит быстро, да?
источник

2_

2flower _ in pgsql – PostgreSQL
Tagil Steel
Причина в том, что PG на каждом уровне вложенности делает временную таблицу. А это получается не быстро. По крайней мере по сравнению с реализацией агрегата на С.
Кроме того, двухуровневые запросы с четко поделенными функциями на мой взгляд понятнее. Ведь суммарно отчетов очень много - несколько десятков, они периодически улучшаются(путем добавления показателей), и числота тоже имеет значение. У нас 3 кастомные функции, котрые легки в понимании, а дальше все стандартно, и всего в 2 уровня.
ну все тушите свет, оказывается нужна просто одна большая кнопка "сделать ммм.. хорошо"
источник

TS

Tagil Steel in pgsql – PostgreSQL
Ð
если дубли появляются из-за джойна каталогов с отношением многие ко многим, явно что-то не так. Нужна нормальная декомпозиция и разделение этого запроса на ряд более простых
Зачем? Какая у этого действия цель? Сделать чтобы было быстрее? Думаю, не получится - он исполняется оптимально. Фетчится только то, что надо и только один раз. Агрегаты тоже не делают лишних проходов. Структура запроса понятна. А делать декомпозинию разди декомпозиции - нерационально.
источник

Ð

Ð in pgsql – PostgreSQL
Когда речь о таблице на 50к строк, беспокоиться о временных таблицах - ну не знаю..
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
Tagil Steel
Причина в том, что PG на каждом уровне вложенности делает временную таблицу. А это получается не быстро. По крайней мере по сравнению с реализацией агрегата на С.
Кроме того, двухуровневые запросы с четко поделенными функциями на мой взгляд понятнее. Ведь суммарно отчетов очень много - несколько десятков, они периодически улучшаются(путем добавления показателей), и числота тоже имеет значение. У нас 3 кастомные функции, котрые легки в понимании, а дальше все стандартно, и всего в 2 уровня.
> Причина в том, что PG на каждом уровне вложенности делает временную таблицу.

Это в общем (т.е. почти всегда) просто не так, извините. Вы это в планах видели или так, запомнили то, что кто-то ляпнул? ;)

> Кроме того, двухуровневые запросы с четко поделенными функциями на мой взгляд понятнее.

Ну так вот на конкретных примерах лучше бы смотреть... я как-то чаще видел наоборот.
источник

2_

2flower _ in pgsql – PostgreSQL
Tagil Steel
Зачем? Какая у этого действия цель? Сделать чтобы было быстрее? Думаю, не получится - он исполняется оптимально. Фетчится только то, что надо и только один раз. Агрегаты тоже не делают лишних проходов. Структура запроса понятна. А делать декомпозинию разди декомпозиции - нерационально.
вы думали что не получится и вчера, однако даже то что вы были не правы, не мешает вам повторять ту же ошибку.
источник

Ð

Ð in pgsql – PostgreSQL
Tagil Steel
Зачем? Какая у этого действия цель? Сделать чтобы было быстрее? Думаю, не получится - он исполняется оптимально. Фетчится только то, что надо и только один раз. Агрегаты тоже не делают лишних проходов. Структура запроса понятна. А делать декомпозинию разди декомпозиции - нерационально.
Рационально. Один долгий фетч это не лучше чем тысяча более мелких
источник

TS

Tagil Steel in pgsql – PostgreSQL
Ð
а проверка существования элемента в массиве, жсон и жсон пас в агрегате, это значит быстро, да?
Это раелизация на PGSQL, она нужна, но первичной не является. Первично исполняется вариант на C, а там поиск в b-деревьях и хранение в связанных списках.
источник

TS

Tagil Steel in pgsql – PostgreSQL
Ð
Рационально. Один долгий фетч это не лучше чем тысяча более мелких
Это почему?
источник

Ð

Ð in pgsql – PostgreSQL
По результатам эксплейна
источник

2_

2flower _ in pgsql – PostgreSQL
я уже даже не говорю о том, что ваша функция может давать разные результаты причем неожиданно, она зависит от входящего ПОРЯДКА т.е. если у вас
в начале пойдет ид 1 10, 1 20, а позднее 1 20, 1 10 вы получите разные цифры.
источник

Ð

Ð in pgsql – PostgreSQL
Мне доводилось делать и подселект внутри перечня полей селекта, чтобы получить категории, да это был цикл из селектов, но в итоге оно летало гораздо быстрее, чем сложный джойн с агрегатом. Это так, к примеру.
источник

TS

Tagil Steel in pgsql – PostgreSQL
2flower _
я уже даже не говорю о том, что ваша функция может давать разные результаты причем неожиданно, она зависит от входящего ПОРЯДКА т.е. если у вас
в начале пойдет ид 1 10, 1 20, а позднее 1 20, 1 10 вы получите разные цифры.
Это почему?
источник

2_

2flower _ in pgsql – PostgreSQL
я вроде бы объяснил там же.
источник

2_

2flower _ in pgsql – PostgreSQL
Ð
Мне доводилось делать и подселект внутри перечня полей селекта, чтобы получить категории, да это был цикл из селектов, но в итоге оно летало гораздо быстрее, чем сложный джойн с агрегатом. Это так, к примеру.
особенно когда подселект использует ТОЛЬКО индекное чтение скорость космическая.
источник

Ð

Ð in pgsql – PostgreSQL
селекты должны всегда использовать индексы, если это не фулскан таблицы )
источник

2_

2flower _ in pgsql – PostgreSQL
я говорю не только о поиске, но и когда у вас выборка только поля из индекса.
источник