CS/데이터베이스

Deferred Join이란? - 실습편

Junuuu 2023. 11. 1. 00:01

개요

Deferred Join이란?-이론 편에 이어 직접 데이터를 세팅하고 성능이 얼마나 개선되는지 확인하는 실습을 진행해보고자 합니다.

 

Spring Boot를 활용한 50만건의 데이터 세팅

@Component
class SettingData(
    private val memberJpaRepository: MemberJpaRepository,
): ApplicationRunner{
    override fun run(args: ApplicationArguments) {
        repeat(500_000){
            memberJpaRepository.save(MemberEntity(name = "test$it"))
        }
    }
}

어떤 방식으로 데이터를 적재하던 상관없습니다.

쿼리문에 따른 실행계획과 성능을 살펴보기 위해 50만 건의 데이터를 적재하였습니다.

 

전통적인 페이징 실행계획

EXPLAIN ANALYZE
SELECT *
FROM member
ORDER BY  member_id, birth_day
LIMIT 20
OFFSET 450000;

 

280ms 정도 소요됩니다.

 

Deferred Join 적용된 실행계획

EXPLAIN ANALYZE
SELECT *
FROM member
INNER JOIN (
    SELECT member_id FROM member ORDER BY birth_day, member_id LIMIT 20 OFFSET 450000
) AS member2 USING (member_id)
ORDER BY member_id, birth_day;

150ms 정도 소요됩니다.

약 2배정도 속도가 개선되었습니다.

 

커버링 인덱스를 충족시키기 위해 인덱스 추가

CREATE INDEX index_name ON member (birth_day);

 

Deferred Join Query의 실행계획을 다시 보면 100ms의 성능을 보여줍니다.

이론보다는 아니지만 순차적으로 성능이 개선된 모습이 보입니다.