Versions Compared

Key

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

JPA는 SQL문을 통해 어플리케이션을 작성했을때보다, 수많은 귀찮은 일을 하지 않아도된다는것을

실습을 통해 파악을 하였습니다. 하지만 실제 그것이 어떠한 SQL문을 수행하는지

또한 그 SQL문이 성능적으로 문제가 없는지 데이터베이스를 병행해서 공부해야하는 과제가 있습니다.

실행계획을 예상하고 측정하는것은 아주 광범위한 주제입니다.

여기서는 다소 자연스럽지 못하더라도

데이터베이스를 공부했을때 성능에 관련된 실행계과 JPA의 내용과 엮어보겠습니다엮어서 내용을 한정짓겠습니다.

Table of Contents

실행계획 고려하기

관계형 데이터베이스의 종류는 많으며, SQL문을 빠르게 작동시키기위해 실행계획을 세우게 되며

...

이름명령어
Oracleset autotrace traceonly
MSSQLSET SHOWPLAN_TEXT_ON
DB2EXPLAIN ALL WITH SNAPSHOT FOR SQL 구문
PostreSQLEXPAIN SQL 구문
MySQLEXPLAIN EXTENDED SQL 구문


JPA TO SQL

JPASQL

studentList = findByGroupInfoName("학생")

SELECT * FROM user ui left join spring.group_info gi

on gi.group_id = ui.group_id and gi.name="학생"

-- 위구문을 어플리케이션사용하기위해서는 실제는

몇가지 더 변환과정이 필요합니다.

dataset = runsql(..)

javaobj = datasetToObj(result)

jsonobj = objToJson(javaobj)


...

실행이 되고 실제 데이터베이스에서 실행계획이 어떻게 되는지 점검할 필요가 있습니다.


JPA문이  실제 어떠한 SQL문을 실행할지 예측할수도 있지만, 아래 옵션을 켜서 실제 SQL문 확인가능합니다.

  • spring.jpa.properties.hibernate.show_sql=true
  • spring.jpa.properties.hibernate.use_sql_comments=true
  • spring.jpa.properties.hibernate.format_sql=true


어플리케이션의 JPA테스트코드와 SQL 실행을 Trace한 예

쿼리실행을 JPA를 통해 간단하게 할수 있기때문에 , 데이터베이스를 조회하고 변경하는 코드에대해

...

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




실행계획 조사하기

실행계획의 출력포맺은 DB마다 다르지만 공통적인 3가지요소가 있습니다.

  • 조작대상 객체:
  • 객체에 대한 조작의 종류
  • 조작 대상이 되는 레코드 수:


순차 풀스캔 VS 인덱스 스캔

엔티티의 설계

Code Block
languagejava
themeEmacs
@Entity
public class User {
	private String name;

	@ManyToOne
	@JoinColumn(name = "GROUP_ID")
    private GroupInfo groupInfo;
}
ManyToOne은 JPA에서 관계도 형성을 하는 어노테이션으로서 실제 데이터베이스에서는
아래와같이 테이블생성시 외래키 설정및 인덱스 설정이 자동으로 수행되게 됩니다.
KEY `FKa36i4ekojwk70bxen390i6tek` (`group_id`) USING BTREE,
CONSTRAINT `FKa36i4ekojwk70bxen390i6tek` FOREIGN KEY (`group_id`) REFERENCES `group_info` (`group_id`)

순차풀스캔

JPASQL
findByName("Minsu")SELECT * FROM user where name = 'minsu2';

...

데이터량이 많아질시 탐색시간이 같이 선형적으로 증가합니다.


인덱스 스캔

JPASQL
findByGroupId(1)SELECT * FROM user where group_id = 2;

...

데이터량이 늘어남에따라 효과를볼수가 있습니다.


스캔 범위/방식에따른 실행계획 전략

성능을 위한 스캔 Type은 3가지정도로 요약할수 있습니다.

...

특히나 쿼리문만보고 실행계획을 예측한다란것은 거의 불가능에 가깝습니다.

권한 이양의 죄악

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

...

항상 최선인 방식을 택하고 또한 그것이 성능적으로  항상 뛰어난 SQL문이다라고 정의내리기는 어렵습니다.

JAP를 통한 튜닝 포인트의 발상변화

JPA에서는 실행계획이 틀어지고, 예측하기 어려운 튜닝포인트를 쿼리중심에서

...