172 похожих чатов

Интересно, а аггрегация SUM будет работать быстрее если на поле

будет навешан индекс?

27 ответов

19 просмотров

От запроса же зависит. Но если только на поле, которое суммируется — он вряд ли будет использован вообще когда-либо (запросы вроде SELECT SUM(amount) FROM transaction; крайне редко используются, как мне кажется).

Yaroslav Schekin
От запроса же зависит. Но если только на поле, кот...

А есть ли какой-либо способ чтобы увеличивать скорость аггрегационных запросов? Чтобы SELECT SUM(amount) FROM transaction; быстрее отрабатывал?

Ярослав Коробейников
А есть ли какой-либо способ чтобы увеличивать скор...

Я же написал, что именно для такого запроса подобный индекс поможет. Встречный вопрос: зачем Вам именно такой запрос, а?

зависит от запроса и условия в запросе (все что идет после WHERE). Если условия нет - то запросу требуются все строи из таблицы - индекс тут не поможет. Если условие есть и нужна только какая-то небольшая часть строк которые будут браться именно по индексу - то индекс поможет.

Alexey Lesovsky
зависит от запроса и условия в запросе (все что ид...

> Если условия нет - то запросу требуются все строи из таблицы - индекс тут не поможет. Не обязательно. Я имел в виду Index-only scan, например.

Yaroslav Schekin
> Если условия нет - то запросу требуются все стро...

index-only-scan поможет уменьшить на некоторый коэффициент время запроса. Зависит от ко-ва байт, которое занимает строка таблиицы. Почему-то мне кажется, что прирост будет не более, чем в 2 раза в среднем, поэтому если размер базы увеличится в 2 раза, то надо делать что-то ещё)

Aleksey Stavrov
index-only-scan поможет уменьшить на некоторый коэ...

> что прирост будет не более, чем в 2 раза в среднем Мне тоже кажется, что в среднем где-то так. > то надо делать что-то ещё) Например, прекратить выполнять бессмысленные запросы. ;)

Yaroslav Schekin
> что прирост будет не более, чем в 2 раза в средн...

> Например, прекратить выполнять бессмысленные запросы. ;) Да, но это ведь бизнес требование. Что бы вы сделали в этом случае? взяли бы соотвествующую СУБД?

Aleksey Stavrov
> Например, прекратить выполнять бессмысленные зап...

Нет, это не бизнес требование (в третий раз уже пишу)! Покажите мне, когда "бизнесу" нужно знать сумму поля в таблице без всяких фильтров. Обычно даже на SELECT COUNT(*) FROM any_table уже ругаются именно в этом плане, а уж у SELECT SUM(a_column) FROM any_table смысла ещё меньше, IMNSHO.

Yaroslav Schekin
> Если условия нет - то запросу требуются все стро...

Разве index-only scan случится именно для такого запроса (если условие не задано)? https://t.me/pgsql/306470 - тут видно, что никакого index-only нет.

Влад Казаков
Разве index-only scan случится именно для такого з...

Надо ещё более искусственные тесты выполнять, ага — можно "доказать" вообще всё что угодно. ;( Естественно, что его там нет — для того, чтобы он был выгоден, размер таблицы должен существенно превышать размер индекса, в первую очередь. И так очень часто и будет для реальных таблиц.

Yaroslav Schekin
Нет, это не бизнес требование (в третий раз уже пи...

Вы правда не верите, что так может быть?) Представим, что вы делаете контест систему (а-ля ACM или golf). Вам хочется видеть ко-во решений посланных по каждой задаче с разбивкой по каждому языку на страничке статистики. Ну тут как ни крути придётся достать все таски, сделать join со всеми решениями и после этого ещё сгруппировать.

Aleksey Stavrov
Вы правда не верите, что так может быть?) Предста...

Единственный способ ускорить на реляционных БД мне известный это делать материализованные виды. Ну или колоночная БД))

Aleksey Stavrov
Вы правда не верите, что так может быть?) Предста...

Я правда не верю, что Вы не умеете читать. ;) Ещё раз, никаких "разбивок" и т.п. — всё это делает указанный индекс (ON a_table(a_column)) абсолютно бесполезным. И, опять-таки, именно этот запрос ( SELECT SUM(a_column) FROM any_table) практически бесполезен, IMNSHO. У Вас есть что возразить на вышенаписанное?

Che
Единственный способ ускорить на реляционных БД мне...

Ещё выше про timescaledb писали. Я тут что-то нашёл, но ещё не прочитал https://docs.timescale.com/timescaledb/latest/how-to-guides/continuous-aggregates/create-a-continuous-aggregate/#using-with-no-data-when-creating-a-continuous-aggregate

Aleksey Stavrov
Ещё выше про timescaledb писали. Я тут что-то наш...

Это тоже про агрегаты, только хитрые

Aleksey Stavrov
Нету

Ну а я только это и имел в виду. Что касается реальных ситуаций — https://t.me/pgsql/306494

Yaroslav Schekin
Нет, это не бизнес требование (в третий раз уже пи...

Ну, справедливости ради, есть один пример - многоэтапная обработка выборки во временной таблице. Вполне может понадобиться агрегировать без where. Пример не совсем честный, т.к. здесь временная таблица - инструмент оптимизации, да и выборка, по сути, уже отфильтрованная.

Radist
Ну, справедливости ради, есть один пример - многоэ...

Я, кажется, никогда не видел, чтобы "обработка выборки во временной таблице" сводилась просто к SELECT SUM(field) FROM temp_table. Может, это и может быть промежуточным звеном какого-то процесса (т.е. с этой таблицей делают и что-то ещё)... но вот индексировать такое просто глупо, Вам не кажется?

Yaroslav Schekin
Я, кажется, никогда не видел, чтобы "обработка выб...

Полностью согласен, поэтому и написал, что пример не честный.

Rainbow Keeper
почему глупо? там же может быть index-only scan

Потому что если единственной целью, с которой создавалась эта временная таблица, было сделать по ней SELECT SUM(field) FROM temp_table, то кто-то что-то делает не так, Вам не кажется? ;)

Похожие вопросы

Обсуждают сегодня

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Ребят в СИ можно реализовать ООП?
Николай
33
у вас два процесса. один посылает другому сигнал. у вас есть код обоих процессов? если всё не так - расскажите как оно на самом деле. а именно кто кому чего, есть-ли консоли,...
Karagy
6
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Карта сайта