mingg IT

[JPA] deleteAll(), deleteAllInBatch(), deleteInBatch() 차이점 본문

BackEnd

[JPA] deleteAll(), deleteAllInBatch(), deleteInBatch() 차이점

mingg123 2021. 12. 9. 17:22

1. deleteAll()

userRepository.deleteAll(userRepository.findAllById(Lists.newArrayList(1L,3L)));
userRepository.findAll().forEach(System.out::println);

우선 첫번째 Select문같은 경우에는 findAllById로 인해 in 절로 select를 해온 이후 1번, 3번이 존재하는지 확인 한다.

(deleteAll에서 argument를 주지않았을 경우에도 동일함. )

 

이후 delete로 해당 id를 하나하나 있는지 검사하면서 지운다. 이로인해 deleteAll()은 성능이슈로 인해 거의 사용하지 않는다.

대용량의 데이터가 있을경우 for문을 하나하나 돌면서 사용하기 때문에

보통 천만건이 넘는 것을 사용할 경우 deleteAllInBatch를 사용한다. 

 

 

1-1 deleteAll()

 userRepository.deleteAll();
 userRepository.findAll().forEach(System.out::println);

 

id갯수만큼 모두 for문을 돌며 delete 쿼리문을 수행하는 것을 확인할 수 있다. 

 

2. deleteAllInBatch

 userRepository.deleteAllInBatch();
 userRepository.findAll().forEach(System.out::println);

 

findAll이나 findById를 사용하지 않았기 때문에 delete이전에 select하는 과정은 없고 해오지 않고 오로직 delete만 한다.

대용량일 수록 우수한 성능을 낼듯. 

 

 

 

3. deleteInBatch

 userRepository.deleteInBatch(userRepository.findAllById(Lists.newArrayList(1L,3L)));
 userRepository.findAll().forEach(System.out::println);

그렇다면 deleteInBatch는 어떠한 차이점이 있을까 ?

 

마찬가지로 findById로 인해  in절로 1번 3번이 있는지 읽어온다.

허나 deleteAll() 과는 다르게 delete쿼리에서 id를  or ? 로 확인한다. 

argument를 주어도 for문을 전부돌며 select해오지 않는것임. 

entity에 값이 있던지 없던지 바로 delete쿼리를 날리는것. 

 

 

 

즉 deleteAll, deleteInBatch, deleteAllInBatch

실제로 for문을 전부 돌며 select를 해오느냐, iterable로 하나하나 확인하며 지우느냐, 아니면  쿼리한번으로 모두 지우느냐 차이이다.

Comments