Home Arrow Icon Knowledge base Arrow Icon Global Arrow Icon Jakie są popularne błędy, które prowadzą do problemu z zapytaniem N 1


Jakie są popularne błędy, które prowadzą do problemu z zapytaniem N 1


Częste błędy, które prowadzą do problemu zapytania N+1, ogólnie obracają się wokół sposobu pobierania danych z bazy danych, szczególnie przy użyciu frameworków mapowania obiektów (ORM) lub ręcznego pisania zapytań bazy danych. Oto szczegółowe wyjaśnienia tych błędów:

** 1. Pobieranie powiązanych danych w osobnych zapytaniach
Główną przyczyną problemu zapytania N+1 jest struktura kodu, aby najpierw pobrać listę rekordów za pomocą jednego zapytania, a następnie wykonanie dodatkowego zapytania dla każdego rekordu w celu uzyskania powiązanych danych. Na przykład zapytanie o listę użytkowników, a następnie osobno zapytanie o posty dla każdego użytkownika, daje 1 zapytanie dla użytkowników plus N zapytań postów, w których N jest liczbą użytkowników. Prowadzi to do wielu małych zapytań zamiast jednego zoptymalizowanego zapytania [1] [2] [3] [7].

** 2. Domyślnie poleganie na leniwym ładowaniu
Większość ORM używa leniwego ładowania jako domyślnej strategii pobierania, co oznacza, że ​​podmioty powiązane są pobierane tylko wtedy, gdy są wyraźnie dostępne. Chociaż może to zaoszczędzić zasoby, jeśli powiązane dane nie są potrzebne, powoduje uruchamianie wielu zapytań podczas iterowania kolekcji, nieświadomie powodując problem N+1. Na przykład dostęp do autora każdego postu na blogu wyzwala osobne zapytanie na post [5].

** 3. Ślepe ponowne wykorzystanie zapytań bez regulacji kontekstowych
Ponowne wykorzystanie tego samego zapytania w różnych częściach aplikacji bez jej dostosowywania może powodować niepotrzebne pobieranie danych i zaostrzyć problem N+1. Zapytania, które nie są zoptymalizowane dla konkretnych przypadków użycia, mogą pobierać niekompletne dane, co skłoniło dodatkowe zapytania do pobrania powiązanych informacji później [8].

** 4. Nie używając chętnych technik ładowania lub optymalizacji zapytań
Brak korzystania z chętnego załadunku (pobieranie powiązanych danych w początkowym zapytaniu) lub zoptymalizowane połączenia powoduje wiele okrągłychek do bazy danych. Dzieje się tak, gdy programiści nie instruują wyraźnie swojego ORM lub Buildera zapytania, aby ładował powiązane podmioty, co prowadzi do wielu małych zapytań zamiast jednego, wydajnego [5] [6] [7].

** 5. Ignorowanie wpływu wielu obiektów obiektowych na bazę danych
Deweloperzy czasami zakładają, że wiele małych zapytań jest szybszych niż jedno złożone zapytanie, ale każde zapytanie obejmuje opóźnienie sieci i przetwarzanie kosztów ogólnych. Skumulowany efekt zapytań N+1 znacznie spowalnia czas odpowiedzi aplikacji i zwiększa obciążenie bazy danych, zwłaszcza w miarę wzrostu objętości danych [1] [3] [5].

** 6. Brak świadomości lub wykrycie problemu
Ponieważ każde indywidualne zapytanie we wzorze N+1 działa szybko, często nie pojawia się w wolnych dziennikach zapytania ani narzędzi monitorowania, co czyni go cichym zabójcą wydajności. Deweloperzy mogą nie zauważyć problemu, dopóki reaktywność aplikacji znacznie nie ulegnie pogorszeniu [2] [5] [7].

Podsumowując, problem z zapytaniem N+1 powstaje głównie z powodu nieefektywnych wzorców pobierania danych specyficznie, zapytania o powiązane dane w osobnych zapytaniach dla każdego rekordu zamiast partii lub łączenia zapytania. Jest to często spowodowane domyślnym leniwym ładowaniem ORMS, brak użycia chętnego ładowania lub partii oraz ponowne wykorzystanie ogólnych zapytań bez optymalizacji. Rezultatem są nadmierne wtrony w obiektach bazy danych, które degradują wydajność i skalowalność [1] [2] [3] [5] [6] [7].

Cytaty:
[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-problem-in-orm-object-relation-mapping
[3] https://www.pingcap.com/article/how-to-effiltly-solve-the-n1-query-problem/
[4] https://evnedev.com/blog/development/the-n1-query-problem-what-is-it-and-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-a-common-activity-7270527662970818561-zmz6
[7] https://dev.to/lovestaco/the-n1-query-problem-the-silent-performance-killer-2b1c
[8] https://www.okoone.com/spark/technology-innovation/avoid-these-7-sql-mistakes-for-better-database-management/