2012-01-05 2 views
2

Я работаю над API, и у меня есть вопрос. Я изучал использование select_related(), чтобы сохранить некоторые запросы к базе данных, и действительно, это помогает уменьшить количество запросов к базе данных, выполняемых по затратам на большие и более сложные запросы.Django: select_related() и использование памяти

Мой вопрос в том, использует ли select_related() использование памяти heasvier? Проведя несколько экспериментов, я заметил, что действительно так, но мне интересно, почему. Независимо от того, использую ли select_related(), ответ будет содержать одни и те же данные, поэтому почему использование select_related() приводит к тому, что используется больше памяти?

Это из-за кеширования? Может быть, отдельные объекты данных используются для кэширования одинаковых экземпляров модели? Я не знаю, что еще думать.

Заранее спасибо.

ответ

6

Это компромисс. Требуется время, чтобы отправить запрос в базу данных, базу данных для подготовки результатов, а затем отправить эти результаты обратно. select_related работает с принципом, что самой дорогой частью этого процесса является цикл запроса и ответа, а не фактический запрос, поэтому он позволяет комбинировать то, что в противном случае было бы разными запросами, только одним, поэтому вместо одного запроса и ответа вместо кратный.

Однако, если ваш сервер базы данных находится под напряжением (не хватает ОЗУ, вычислительной мощности и т. Д.), Более крупный запрос может на самом деле занять больше времени, чем цикл запроса и ответа. Если это так, вам, вероятно, необходимо обновить сервер, но вместо этого использовать select_related.

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

ОБНОВЛЕНИЕ (добавление более подробного объяснения)

Запросы к базе данных на самом деле включает в себя несколько шагов:

  1. приложение генерирует запрос (незначительное)
  2. запрос отправляется на сервер базы данных (миллисекунды до секунд)
  3. База данных обрабатывает запрос (в миллисекундах до секунд)
  4. Запрос res (от миллисекунд до нескольких секунд)

В хорошо настроенной среде (достаточные ресурсы сервера, быстрые соединения) весь процесс завершен всего за миллисекунды. Тем не менее, шаги 2 и 4, как правило, обычно занимают больше времени, чем шаг 3. Вот почему имеет смысл отправлять меньше более сложных запросов, чем несколько простых запросов: узким местом обычно является транспортный уровень, а не обработка.

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

Тем не менее, если это так, правильным ответом является исправление базы данных: оптимизация базы данных и ее конфигурации, добавление дополнительных ресурсов сервера и т. Д., А не возврат к отправке нескольких простых запросов.

+0

Крис, спасибо за ответ. Один последующий вопрос; Вы упомянули: если ваш сервер базы данных находится под нагрузкой, более крупный запрос может на самом деле занять больше времени, чем цикл запроса и ответа_. В чем причина этого? Как более длительный запрос занимает больше времени, чем цикл запроса/ответа? И как больше памяти съедается по более крупному запросу? Спасибо :) –

+0

По запросу «больше» я имею в виду более сложный (с участием объединений и т. Д.), Не обязательно текстовую длину фактического запроса. Затем база данных должна выполнить много дополнительной работы, выбрав данные из нескольких источников и сшивая все это вместе. Кроме того, если эти таблицы содержат много столбцов и/или строк, которые могут добавить к времени и обработке. Если система, работающая с БД, имеет достаточные ресурсы, она не должна занимать больше нескольких миллисекунд. Однако, если система находится под напряжением, что приводит к переполнению памяти и пейджингу, это может занять гораздо больше времени. –

+0

Фантастический ответ :) Хотелось бы, чтобы я мог вас продвигать дальше! –