LINUX.ORG.RU

Нубский вопрос про чтение данных

 ,


0

2

Раньше я с базами данных не работал а тут неожиданно пришлось иметь дело.

Есть БД на postgresql. В ней есть таблица на 1-2 млн. записей. В конечном итоге надо её всю считать, и записать данные на диск разбив по группам. Группы определяются значением полей. На группу приходится около 10 тыс. записей

Вопрос:

Что рациональнее с точки зрения производительности и потребляемой памяти - переложить выборку по группам на БД или делать это самому?

Насколько быстрее запросы вида " SELECT ... WHERE some_field='some_id' " выполняются по сравнению с ручной обработкой?

★★★★

Последнее исправление: pathfinder (всего исправлений: 1)

БД не про скорость, а про надёжность и доступность.

Evgueni ★★★★★
()

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

Без индексов БД будет делать full scan, что может быть сравнимо с обработкой на клиенте. Но даже тут я бы поставил на БД, просто в силу близости данных, качества кода и пр.

В общем, группировку делай на стороне БД.

hippi90 ★★★★★
()

Присоединюсь к тем, кто рекомендует БД. Ещё, есть такой интересный момент - если БД вдруг на локалхосте(ну кто его знает чего у тебя за кейс), то можно вообще твоё решение оформить как плагин к postgress'у. Хранимки можно писать как минимум на C, со всеми вытекающими и доступным api.

pon4ik ★★★★★
()

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

Там есть какая-то агрегация, или только выгрузка всех данных?

Что рациональнее

Ничего. Во-первых, выгребание всего содержимого - это вообще не паттерн для БД и значит что ты выбрал неправильный инструмент. Во-вторых, тем не менее, 1-2 млн это смешные объёмы. В-третьих, у тебя в любом случае будет выгребаться вся таблица.

Если есть агрегация, конечно её лучше сделать в базе и одним запросом. Если нужно выгрести все данные, пляши от клиентского кода - если он может обработать все данные потоково, конечно быстрее будет один единственный select. Клиент будет вычитывать записи по одной и сразу писать, например, в нужный уже открытый файл в зависимости от группы. Если же нужно вычитывать данные в память, что-то с ними делать, потом писать, в зависимости от объёма данных, прогнозов его роста и ограничений по памяти может потребоваться бить данные на меньшие пачки.

Насколько быстрее запросы вида " SELECT ... WHERE some_field='some_id' " выполняются по сравнению с ручной обработкой?

Что такое ручная обработка? В общем случае производительность WHERE зависит от наличия индексов и селективности условия. Если запрошенный id встречается в таблице один раз и по колонке есть индекс, запись можно извлечь быстро. Если запрошенный id встречается у половины записей, то индекс никак не поможет и будет просканирована вся таблица.

slovazap ★★★★★
()

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

Legioner ★★★★★
()

Надо смотреть explain запроса (в запрсое учесть или создать индексы), и учесть нагрузку на БД..

В целом можно и так и так, зависит от нагрузки на базу. «Разбить по группам» может быть очень-очень нетривиальной операцией для базы, и аггрегацией, окнами, преобразованиями и соединениями.

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

OxiD ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.