2013-06-19 2 views
2

Большинство обычаев/руководств объясняют, как использовать методы в контексте управляемой БД.Что происходит, когда запрос получает очень большие результаты.

Так что если User.where(some condition) возвращает результат в десятки или сотни было бы разумно думать, что Rails/DB/сервер может справиться с этим

Что произойдет, если тот же запрос был возвращать результат тысячи или сотни тысяч записи? Осмелюсь сказать миллион записей?

От чего это зависит? Какие ограничения вызывают Rails или аппаратное обеспечение (если есть)? (? Без сбоев все)

И самое главное, есть ли способ, чтобы обрабатывать такие большие наборы данных в Rails

+1

Лучший способ обработки большого набора данных - оставить его в базе данных и выполнить всю свою работу с ним в базе данных. –

+1

Вопрос: «Что вам нужно сделать с миллионами выбранных записей? Отобразите их пользователю?« –

+0

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

ответ

2

ОК, давайте начнем с:

Что произойдет, если вы попытаетесь поставить ведро воды в стакане?

Вот все говорят, что:

  1. Первая зависимость является размер вашей базы данных.
  2. Для выбора миллионов строк требуется размер (в миллисекундах) строки и, следовательно, требуется много Spool Space. Потребность в пространстве значительно возрастает, если катушка еще больше соединена.
  3. Эти много строк влияют на производительность и делают запрос более медленным, если база данных не знакома с параллелью и не имеет интеллектуального оптимизатора.

Во всяком случае, я думаю, что если вы имеете дело с миллионами/триллионами данных, вы должны рассмотреть возможность перемещения на сегодняшний день складов, таких как Teradata.

3

Главное, что PostgreSQL материализует результирующий набор на диск, если он становится слишком большим. Это означает, что вы получаете быстрый удар, но он сохраняет память свободным для других операций.

Как правило, в PostgreSQL редко требуется отправлять сотни тысяч или миллионы строк клиенту. Ключ состоит в том, чтобы создавать ваши запросы (и с необходимыми расширениями SQL по мере необходимости), чтобы возвращать в базу данных только данные, необходимые вашему интерфейсу, правильно агрегированные и т. Д. Я встречал нескольких людей, которые думают, что включение такой логики агрегации в db замедляет ее (и есть временная стоимость процессора), но затраты в этой области, как правило, многократно погашаются в ожидании ввода-вывода на диске временные затраты и тому подобное.

Основной вопрос, который я задал бы, - «зачем вам нужно видеть миллионы записей?» Вы в основном говорите, что хотите сохранить их в памяти или сохранить их на диске, затем перенести их по сети, затем получить их, а затем обработать. Это не пример эффективности. Это far лучше обрабатывать миллионы записей рядом с хранилищем и, следовательно, тратить некоторую стоимость процессора для других.

Если вам нужно что-то более сложное внутризарядное параллелизм в смешанной или DW-среде, перейдите в Postgres-XC вместо vanilla PostgreSQL. Это имеет значительную сложность, но в больших средах решения других неразрешимых проблем решаются.

Смежные вопросы