Вам действительно не нужны статистические данные для этого, только математика. N + 1 (или лучше 1 + N) означает
- 1 запрос для получения записи и
- N запросов для получения всех записей, связанных с ним
Чем больше N, тем больше снижается производительность, особенно если ваши запросы отправляются по сети в удаленную базу данных. Вот почему проблемы N + 1 продолжают возникать в работе - они обычно незначительны в режиме разработки с небольшим объемом данных в БД, но, поскольку ваши данные растут в производстве до тысяч или миллионов строк, ваши запросы будут медленно душить ваш сервер. 1009 *
Вместо этого вы можете использовать
- один запрос (через объединение) или
- 2 запроса (один для основной записи, один для всех связанных записей
Первый запрос вернет больше данных, чем строго необходимо (данные первой записи будут дублироваться в каждой строке), но обычно это хороший компромисс. Второй запрос может быть немного громоздким для больших наборов данных, так как все внешние ключи передаются как один диапазон, но, опять же, это обычно компромисс, который стоит сделать.
Фактические числа зависят от слишком большого количества переменных, чтобы статистика была значимой. Количество или записи, версия БД, оборудование и т. Д. И т. Д.
Поскольку вы пометили этот вопрос с помощью rails, ActiveRecord отлично справляется с задачей, избегая N + 1 запросов, если вы знаете, как его использовать. Проверьте объяснение нетерпеливая загрузка .