Home Arrow Icon Knowledge base Arrow Icon Global Arrow Icon Які поширені помилки призводять до проблеми запиту N 1


Які поширені помилки призводять до проблеми запиту N 1


Поширені помилки, що призводять до проблеми запитів N+1, як правило, обертаються навколо того, як дані отримують з бази даних, особливо при використанні рамок реляційного відображення (ORM) або запису бази даних вручну. Ось детальні пояснення цих помилок:

** 1. Отримання пов'язаних даних в окремих запитах
Основною причиною проблеми запиту N+1 є структурування коду, щоб спочатку отримати список записів одним запитом, а потім виконати додатковий запит для кожного запису для отримання даних, пов'язаних з. Наприклад, запит списку користувачів, а потім окремо запитувати публікації для кожного користувача призводить до 1 запиту для користувачів плюс N запитів для публікацій, де N - кількість користувачів. Це призводить до багатьох невеликих запитів замість одного оптимізованого запиту [1] [2] [3] [7].

** 2. Покладаючись на ліниву завантаження за замовчуванням
Більшість ORM використовують ледачі завантаження як стратегію отримання за замовчуванням, що означає, що пов'язані суб'єкти отримують лише при чіткому доступі. Хоча це може заощадити ресурси, якщо пов’язані дані не потрібні, це спричиняє спрацьовування декількох запитів при ітерації над колекціями, несвідомо спричиняючи проблему N+1. Наприклад, доступ до автора кожної публікації в блозі індивідуально запускає окремий запит на публікацію [5].

** 3. Сліпо повторне використання запитів без контекстних коригувань
Повторне використання одного і того ж запиту в різних частинах програми без пошиття, це може спричинити непотрібне пошук даних та посилити проблему N+1. Запити, які не оптимізовані для конкретних випадків використання, можуть отримати неповні дані, що спонукало додаткові запити отримати пов’язану інформацію пізніше [8].

** 4. Не використовуючи нетерплячі методи завантаження або оптимізації запитів
Не вдалося використовувати нетерпляче завантаження (отримання пов’язаних даних у початковому запиті) або оптимізоване приєднується призводить до декількох кругообігу до бази даних. Це відбувається, коли розробники прямо не доручають своєму будівельнику ORM або запитів завантажувати суб'єкти, що стосуються між собою, що призводить до багатьох невеликих запитів замість одного, ефективного [5] [6] [7].

** 5. Ігнорування впливу декількох кругообігу на базу даних
Розробники іноді припускають, що багато невеликих запитів швидше, ніж один складний запит, але кожен запит передбачає затримку мережі та обробку накладних витрат. Сукупний ефект запитів N+1 суттєво уповільнює час відгуку про застосування та збільшує навантаження на базу даних, тим більше, що об'єм даних зростає [1] [3] [5].

** 6. Відсутність усвідомлення або виявлення проблеми
Оскільки кожен окремий запит у шаблоні N+1 працює швидко, він часто не з’являється у повільних журналах запитів або інструментів моніторингу, що робить його безшумним вбивцею. Розробники можуть не помітити проблему до тих пір, поки реагування на додаток значно не погіршиться [2] [5] [7].

Підводячи підсумок, проблема запитів N+1 виникає в основному через неефективні шаблони отримання даних, зокрема, запиту, пов'язані з цим, в окремих запитах для кожного запису, а не для пакетів або з'єднання запитів. Це часто викликається лінивим завантаженням за замовчуванням в ормах, невиконанням нетерплячого завантаження або партії та повторного використання загальних запитів без оптимізації. Результатом є надмірна база даних, що погіршують продуктивність та масштабованість [1] [2] [3] [5] [6] [7].

Цитати:
[1] https://planetscale.com/blog/what-is-n-1-query-problem-and-how-to-solve-it
[2] https://stackoverflow.com/questions/97197/what-is-the-n1-selects-promblem-in-orm-object-relational-mapping
.
[4] https://evnedev.com/blog/development/the-n1-query-problem-what-is-it-how-do-you-solve-it/
[5] https://digma.ai/n1-query-problem-and-how-to-detect-it/
[6] https://www.linkedin.com/posts/aftab-ahmed-bb002827_avoiding-the-n1-query-problem-acommon-activity-727052762970818561-zmz6
[7] https://dev.to/lovestaco/the-n1-query-problem-the-silent-performance-killer-2b1c
[8] https://www.okoone.com/spark/technology-inovation/avoid-these-7-sql-mistakes-for-better-database-management/