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

🙋привет всем! подскажите, что можно сделать для оптимизации простого select-запроса? например: select

(field2, field3) from base where filed = "value"
в случае этого запроса будет выбрано 14 млн строк. при таком запросе очень нагружается cpu и i/o.
что можно сделать для оптимизации?
окей, можно сделать индексы на поля field2, field3. но что еще?
поможет ли limit в данной ситуации?

29 ответов

11 просмотров
Sergius- Автор вопроса

не понял смысл вопроса. выбирается 14 млн из общей базы для дальнейшей работы с этими данными

Sergius- Автор вопроса

потому что они подходят под фильтр) все данные - нужные

Sergius- Автор вопроса
central hardware
прямо здесь и сейчас?

да. т.к. тут 20 сек мута, напишу в этом сообщении. это не однотипная задача. бизнес-логика проекта большая, выборки - тоже большие. что с этими данными происходит - это другой вопрос. просто есть факт большой выборки

Sergius
да. т.к. тут 20 сек мута, напишу в этом сообщении...

ваш сервер с бизнес логикой сможет сразу переворить 14 милионов записей?

Sergius- Автор вопроса

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

Sergius
ну окей. завтра будет 100 млн. данные, уникальные...

Выбирать курсорами. Зачем вам 100 миллионов тянуть в память?

Sergius- Автор вопроса
Альберт Степанцев
Выбирать курсорами. Зачем вам 100 миллионов тянуть...

супер. уже что-то. не знал про них. сейчас почитаю. спасибо

Sergius
ну окей. завтра будет 100 млн. данные, уникальные...

Что значит "обработать"? Они как-то друг с другом связаны, при обработке одного вам могут понадобиться данные другого? Если нет - то обрабатывайте их последовательно, пачками по миллиону например, или как вам там удобно. Если да - то либо переносить логику обработки ближе к данным (т.е. обрабатывать прямо в БД хранимками) либо всё таки тащить все целиком.

> при таком запросе очень нагружается cpu и i/o. Хмм... а Вы чего ожидали, извините? Что PostgreSQL возьмёт данные из воздуха (прочитать-то их нужно, правда)? ;) > поможет ли limit в данной ситуации? У Вас и проблемы-то нет, по-моему. Чтобы выдать данные как можно быстрее, PostgreSQL использует имеющиеся ресурсы, и это нормально. Вы, что, хотите, чтобы всё работало помедленнее (а disk, CPU и RAM в этот сервер вставлены для того, чтобы ими любоваться?). ;) Кроме шуток, лучшего по производительности, чем с index-only scan, тут не добьёшься. Если Вам почему-то нужно экономить ресурсы — сам PostgreSQL таким не занимается, нужно что-то внешнее (но зачем?!).

Sergius- Автор вопроса

посмотрел один из кусков кода. упрощенно: берутся записи товаров из бд. сервис их как-то обрабатывает и дополняет. дальше эти данные летят в кафку для других сервисов. я не особо понимаю, при чем тут бизнес-логика, т.к. я сказал про факт того, что данные выбираются по критериям, они нужные, и их не становится меньше

Sergius- Автор вопроса
Sergey Bezrukov
Что значит "обработать"? Они как-то друг с другом...

всё целиком не обязательно тащить. для порционной выборки подойдут только курсоры?

Sergius
посмотрел один из кусков кода. упрощенно: берутся ...

Я бы сделал условие вида id > N и LIMIT добавил. N увеличивал бы на каждой итерации

Sergius- Автор вопроса

это на уровне бд делается, верно? если да, то печаль

Sergius- Автор вопроса
Sergius- Автор вопроса

эх, спасибо. тогда пойду выбивать их инженеров секционирование

Sergius
эх, спасибо. тогда пойду выбивать их инженеров сек...

А ведь это, скорее всего, не поможет — только время зря потратите. Впрочем, дело Ваше...

Sergius- Автор вопроса

к сожалению, не глубоко изучил проблему) признаю

Yaroslav Schekin
А ведь это, скорее всего, не поможет — только врем...

Тут я склонен согласиться, и я бы все-таки предложил обновлять частями, по скажем 10к товаров выбирая, как предложили выше по id > ... limit 10000

Sergius- Автор вопроса
Pavel Chernoskutov
Тут я склонен согласиться, и я бы все-таки предлож...

так всё таки лимит снизит нагрузку? я как понял из ответа Ярослава, она не даст результата по кушанию ресурсов

У меня тут много вопросов возникает. 1) вам нагрузка не нравится, потому что она идёт скачками (в период выполнения тяжёлого запроса) и влияет на выполнение других запросов? Если так, то высасывать данные пачками по 10-100к - нормальный вариант. Можно хоть thread.sleep делать между итерациями. Но нужно придумать, как определять, какие данные уже были выбраны, чтоб эта схема оказалась не *N(батчей) по ресурсоемкости от текущего варианта. 2) эти 14 миллионов записей каждый раз разные? Или постоянно одни и те же данные выбираются, потому что нет инкрементальности? Если так, то добавление инкрементальности в схему/запрос - скорее всего лучшее решение

Sergius- Автор вопроса
Alexander Shelemin
У меня тут много вопросов возникает. 1) вам нагруз...

я правильно же понимаю, что под пачками имеется ввиду limit? но да, при таких скачках у нас "тупят" другие запросы. и что есть инкрементальность, простите за вопрос?)

Alexander Shelemin
У меня тут много вопросов возникает. 1) вам нагруз...

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

Sergius
я правильно же понимаю, что под пачками имеется вв...

Limit в каком-то виде, да. Про инкреметальность - насколько я понял ваш вопрос, клиент регулярно высасывает 14 миллионов записей. Вопрос возникает, что это за записи - все 14 миллионов каждый раз новые, или это одни те же записи с небольшими изменениями, которые каждый раз целиком выбираются из базы и где-то ниже по пайплайну diff'аются с предыдущей выборкой

Alexander Shelemin
Либо потоково читать, да, как уже выше советовали,...

И на диск и на проц сервера БД так же влияет, так как положить все данные в память требуется их прочитать с диска сначала. Курсоры этого не наделают а читают последовательно при Next.

Sergius- Автор вопроса
Alexander Shelemin
Limit в каком-то виде, да. Про инкреметальность - ...

по идее, данные могут меняться, не все, частями и не всегда

Che
И на диск и на проц сервера БД так же влияет, так ...

Если клиент очень быстро обрабатывает (типа просто шлёт кафку все сразу), то кажется все равно могут быть проблемы. Но у меня мало опыта с курсорами, может они прям божественно работают для такого кейса)

Sergius
по идее, данные могут меняться, не все, частями и ...

Ну вот, идея про инкреметальность - добавить признак, по которому можно понять, изменилась запись с последнего запроса или нет. Можно заюзать sequence, например

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

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

30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
~ 2m21s  nix shell github:nixos/nixpkgs#stack ~  stack ghc -- --version error: … while calling the 'derivationStrict' builtin at /builtin/derivation.nix:...
Rebuild your mind.
6
Карта сайта