Middle
169
n+1 таңдау мәселесі дегеніміз не?
AI-дан жауап
sobes.tech AI
Бұл дерекқорлармен жұмыс істеу кезінде өнімділік мәселесі, онда байланысты деректерді алу үшін N+1 сұрауы орнына бір сұрау қажет.
Бұл келесі жағдайларда болады:
- Ата-ана объектілерінің тізімін алу үшін бір сұрау орындалады.
- Содан кейін әрбір объект үшін байланысты балама объектілерін алу үшін жеке сұрау орындалады.
JPA-да мысал:
// Пайдаланушылар тізімін алу
List<User> users = userRepository.findAll();
// Әрбір пайдаланушы үшін оның тапсырыстарын алу
for (User user : users) {
List<Order> orders = user.getOrders(); // Бұл әр пайдаланушы үшін дерекқорға N сұрауын шақырады
}
Шешім: Байланысқан деректерді бір рет жүктеуге арналған сұрауларды пайдалану:
-
JOIN FETCH: Байланысқан объектілерді негізгі объектімен бірге бір сұрауда жүктеу.
// JPQL мысалы List<User> users = entityManager.createQuery("SELECT u FROM User u JOIN FETCH u.orders", User.class).getResultList(); -
EntityGraph: Объектілер графын жариялау арқылы жүктелетін байланысты объектілерді көрсету.
// Объект деңгейінде @Entity @NamedEntityGraph(name = "User.orders", attributeNodes = @NamedAttributeNode("orders")) public class User { // ... } // Репозиторийде пайдалану @Query("SELECT u FROM User u") @EntityGraph(value = "User.orders") List<User> findAllWithOrders(); -
Batch Fetching: Байланысқан объектілерді топтап жүктеу (ORM бұл белгілі бір конфигурацияда жасай алады).
N+1 сұрауын жою қолданбалардың өнімділігін айтарлықтай жақсартады, себебі дерекқорға сұраулар санын азайтады.