[JPA] deleteAll(), deleteAllInBatch(), deleteInBatch() 차이점
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로 하나하나 확인하며 지우느냐, 아니면 쿼리한번으로 모두 지우느냐 차이이다.