Middle
Ի՞նչ է n+1 ընտրության խնդիրը։
sobes.tech AI
Պատասխան 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 խնդիրը՝ զգալիորեն բարելավելով հավելվածների կատարողականությունը՝ նվազեցնելով տվյալների բազայի հարցումների քանակը։