Page History
...
address_view에서 where조건에 서브쿼리를 사용하여 특정테이블이 가진 데이터의 매칭 조건을 설정한 예입니다.
샘플 SQL은 서브쿼리부터 실행을 합니다. ( 실제로 이러한 순서대로 작동이되는지 실행계획을 통해 다시 검증하는것도 필요해보입니다.)
그래서 SELECT에서의 서브쿼리가 아래와같은 상수로 변경이됩니다.
...
이러한 서브쿼리는 하드코딩을 없앨수 있는 요소로 활용이 될수 있습니다.
JPQL에서 서브쿼리
...
사용
서브쿼리는 성능적으로 안좋은 영향을 줄수 있기때문에, 서브쿼리 사용시에는
DBMS가 어떠한 실행계획을 세우고 수행이 되는지 체크할 필요가 있습니다.
이경우 Index설정이안된 문자열비교를 했기때문에
100(Address 총개수) + 3 (VipUser수) = 103 번의 총 스캔이 발생하였기때문에 나쁜케이스는 아닙니다.
스캔수가 Left * Right 가 되는경우
JPQL에서 서브쿼리 사용
JPQL 에서 서브쿼리는 몇가지 제약조건이 있습니다.
- WHERE , HAVING 절에서만 사용가능
- SELECT,FROM 절 이후에는 사용불가
JPQL 에서 서브쿼리는 몇가지 제약조건이 있습니다.
- WHERE , HAVING 절에서만 사용가능
- SELECT,FROM 절 이후에는 사용불가
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
public interface AddressViewRepo extends Repository<AddressView, Long>{ @Query("select t from AddressView t where t.name in (select v.name from VipUser v)") List<AddressView> findVipAddress(); } //쿼리조회 Iterable<AddressView> userList = addressViewRepo.findVipAddress(); |
위 샘플은, View테이블 조회 조건을 서브쿼리로 처리한 예입니다.
서브쿼리 실행계획 검증
서브쿼리는 성능적으로 안좋은 영향을 줄수 있기때문에, 서브쿼리 사용시에는
DBMS가 어떠한 실행계획을 세우고 수행이 되는지 체크할 필요가 있습니다.
filtered : row 수가 10/100 이기때문에 , 10개의 데이터를 찾으려고 100번의 순차 FullScan을 한 케이스이기때문에 최적탐색이
되었다라고는 볼수없으나,서브 쿼리를 사용하여 그런것은 아니며 where name in ('A','B','C') 형태의 하드코딩을 3번의 스캔으로
만으로 성능에 큰 변화없이 설정화가 되었다라고 알아둡시다.
JPA와 관련한 실행계획은 이후에 다시 다룰예정입니다.
JPA Query 수행방법
JPA에서 전략에따라, 다양한 방법으로 쿼리문 수행이 가능하다란것을 알아보았습니다.
...