Sobes.tech
Middle
169

n+1 таңдау мәселесі дегеніміз не?

AI-дан жауап

sobes.tech AI

Бұл дерекқорлармен жұмыс істеу кезінде өнімділік мәселесі, онда байланысты деректерді алу үшін N+1 сұрауы орнына бір сұрау қажет.

Бұл келесі жағдайларда болады:

  1. Ата-ана объектілерінің тізімін алу үшін бір сұрау орындалады.
  2. Содан кейін әрбір объект үшін байланысты балама объектілерін алу үшін жеке сұрау орындалады.

JPA-да мысал:

// Пайдаланушылар тізімін алу
List<User> users = userRepository.findAll();

// Әрбір пайдаланушы үшін оның тапсырыстарын алу
for (User user : users) {
    List<Order> orders = user.getOrders(); // Бұл әр пайдаланушы үшін дерекқорға N сұрауын шақырады
}

Шешім: Байланысқан деректерді бір рет жүктеуге арналған сұрауларды пайдалану:

  1. JOIN FETCH: Байланысқан объектілерді негізгі объектімен бірге бір сұрауда жүктеу.

    // JPQL мысалы
    List<User> users = entityManager.createQuery("SELECT u FROM User u JOIN FETCH u.orders", User.class).getResultList();
    
  2. 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();
    
  3. Batch Fetching: Байланысқан объектілерді топтап жүктеу (ORM бұл белгілі бір конфигурацияда жасай алады).

N+1 сұрауын жою қолданбалардың өнімділігін айтарлықтай жақсартады, себебі дерекқорға сұраулар санын азайтады.