Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

물론 실행계획까지 개발툴에 통합되어 포함되었으면 하는 바램도 있습니다. 


실행계획 조사하기

해당 SQL문은, 이중루프가 사용됨을 

번거롭지만, JPA를 학습하고 사용하는동안, JPA사용을 통해 단축된 개발시간을 이러한 습관을 가지는 시간을

확보하는것이  중요해보입니다.


JOIN 작동방식 정리

...

이것을 정리한 다시 이유는, JOIN명령에 따른 JOIN및 조건절에 따라 드라이븐이 시작되는 시작 위치가 달라질수도 있고

절차형 프로그래밍에서 이야기하는 루프의 형태가 달라질수 있다란 의미입니다.

...

  • 이중루프(Nested Loops) : 한쪽테이블을 읽으면서 결합조건에 맞는 레코드를 다른쪽에서 찾음
  • Sort Merge : 결합할 두 테이블을 정렬을 하고 순차적으로 결합
  • Hash : 결합 키값을 해시로 맵핑


이중루프중에도 양쪽풀스캔을(곱하기)하고 랜덤스캔을 하는 케이스가 성능적으로 가장 나쁜 케이스라고 보시면됩니다.


조건이 잘못되거나,필터(파티션)를 고려하지 않거나, 인덱스설정에따라 조인의 실행계획은 최악이 될수가 있습니다.


권한 이양의 죄악

이러한 실행계획 개입은, SQL문을 통해 할수있는게 아니고, RDB에 모든것을 이양해야합니다.이양해야하고

실제 작동을 시켜 실행계획을 파악해야합니다. 테이블 설계가 동일하다고 가정했을시

코드가 길어도 실행계획이 띄어난 SQL문 VS 간결한 SQL문, 두가지 SQL문이 있다고 하면

...

몇가지 일반적으로 최악이 아닌 일반화는 있지만, 표준화가 되기 어려운내용입니다.

JPA의 경우도 이러한 권한이 권한을 받을수가 없습니다. 다만  최악의 실행계획을 수행하는 코드를 일반적으로 생성하지 않습니다.

대부분의 경우 JPA의 기본 인테페이스가 이해하는 SQL문이, 우리가 이해하는 SQL문보다 성능적으로 나쁘지 않는 SQL문을 만들어냅니다.만들어내며

테이블도 자동으로 생성해줄수 있습니다. 하지만 이것만으로 충분하지 않습니다.

JPA에서는 이러한 탐색효율과 반복을 최적화하는 방법에대해서 RDB에게만 모든것을 맡기지 않습니다.

JPA PROXY 라는 중간 객체를 통해 Lazy loading, Eager loading등의 전략을 수행할수가 있습니다. JPA 는 SQL문이 하지못하는 몇가지 성능에 관련된 전략을 사용할수가 있습니다.

같은 쿼리라도 달라지는 RDB에의해 달라지는 변경이되는 복잡한 실행계획에만 의존하지 않는 전략입니다않겠다는 전략입니다.


Read전략:

  • 즉시읽기( Eager loading) : 
  • 지연읽기 ( Lazy loading ) :

영속성 전이 전략:

  • ALL : 부모의 변화가 자식에게 모두 전가
  • PERSIST : 부모의 영속화 될때 자식도 영속화가됨
  • MERGE : 트랜젝션이 종료되고 변경사항이 merge()수행시 변경사항적용
  • REMOVE : 부모삭제시 연관된 자식도 삭제
  • REFRESH : 부모가 변경되면 자식도 변경
  • DETACH : 부모가 DETACH되면, 연관된 ENTITY도 DEATCH되어 변경반영 죽시 안됨
  • orphanRemoval : 연관관계가 끊어진 자식을 자동으로 제거


위 전략은 모두, 어플리케이션에서 DB와 연관된 불필요한 Read/Write등을 줄이고 그것을 어플리케이션에

반영할수 있는 기회를 제공해줍니다. 이것은 케이스별로 사용해야할 전략이 다르기 때문에

구체적인 예와함께 다시 언급을 하고, 현재는 이러한게 있는것만 알고 넘어가겠습니다