DataBase

DataBase/My-Batis

Out Of Memory Error. MyBatis Batch Insert 시 OOME 방지.

1. 일반적인 경우의 MyBatis Insert. 어떤 로직을 거쳐 생성된 객체 100만개를 DB에 insert 해야 하는 상황이다. private List getMemoList() { List list = new ArrayList(); // 100만번 loop를 돌아 100만개의 요소를 생성해 list에 add 한다. for (int i = 0; i < 1_000_000; i++) { MemoDTO memo = new MemoDTO(); memo.setMemberId(1); memo.setMemo("메모 테스트 입니다!메모 테스트 입니다!"); list.add(memo); } return list; } 위와 같이 MemoDTO 객체를 100만개 임의로 생성해서 List에 넣었다. 위 객체를 DB에 in..

DataBase/SQL

SELECT 시 COLUMN 값에 따라 ROW별로 다른 검색조건을 적용하기.

보통은 Column 값에 따라 조회조건을 다르게 하려고 하면 UNION을 사용한다. 그러나 UNION을 사용하면, 컬럼별로 적용해야 하는 조회조건이 늘어날 수록, UNION 해야 하는 SELECT 쿼리의 갯수도 같이 늘어난다. 다른방법이 있는데 아래와 같이 and or 조건을 사용하는 것이다. - 주소가 서울인 레코드의 경우에만 20살 이상의 남성을 검색하고, 타 지역의 경우엔 전부 검색을 원할 때는? where (city = '서울' and age >= 20 and sex = 'man') OR (city != '서울') 이렇게 하면 각 조건마다 union 을 사용 한 것과 같은 효과를 낸다.

DataBase/JOOQ

[JOOQ] Select 문 커스텀해서 만들기. Dynamic select statement. select custom.

특정 조건에 따라서 select 문을 조합해서 만드려고 한다면, SelectQuery 타입을 사용 하면 된다. https://www.jooq.org/javadoc/latest/org.jooq/org/jooq/SelectQuery.html SelectQuery (jOOQ 3.15.1 API) All Superinterfaces: Attachable, AttachableQueryPart, AutoCloseable, ConditionProvider, FieldLike, Fields, Flow.Publisher , Iterable , Publisher , org.reactivestreams.Publisher , Query, QueryPart, ResultQuery , Select , Serializable, S..

DataBase/SQL

최근 데이터로 조인한 후 group by 할 경우.

가장 최근 데이터를 조회 하려면? - select max(id), name, age from T1 group by name, age; 정답. 만약, group by에 빠진 컬럼이 있다면? - select max(id), name, age from T1 group by name; 이렇게 age가 group by 에서 빠지게 되면 이름과 age가 정상적으로 맵핑되지 않는다. case 1. 그럼 조인할 때는? select max(t1.id), t1.name, t2.address ... from t1 inner join t2 on t1.id = t2.id group by t1.name, t2.address .... 이렇게 컬럼 갯수가 많아지면, 조회하는 컬럼 전체를 group by로 지정하기 어려움. 그러면 이..

DataBase/My-Batis

MyBatis 쿼리 로그를 이쁘게 정렬 해보자

MyBatis 쿼리가 위와 같이 불편하게 출력되고 있습니다. 한줄짜리 쿼리로그는 ? 를 아래 Parameters 에 출력된 '메모(String)'로 수동으로 넣어서 쿼리를 조회하면 되겠지만, 쿼리가 100줄이상에 parameter가 10개 넘어가면 일일이 찾아 바꿔 조회하는 것도 번거롭습니다. 파라미터가 바인딩된 쿼리로 pretty 하게 출력되도록 설정해보겠습니다. 1. build.gradle에 log4jdbc dependency추가. /** for MyBatis Log Beautifier. using log4jdbc */ implementation('org.bgee.log4jdbc-log4j2:log4jdbc-log4j2-jdbc4.1:1.16') 2. main/resources/ 하위에 log4jdb..

DataBase/JOOQ

[JOOQ] SQL pretty.

https://www.jooq.org/doc/3.2/manual/sql-building/queryparts/pretty-printing/ Pretty printing SQL As mentioned in the previous chapter about SQL rendering, there are some elements in the org.jooq.RenderContext that are used for formatting / pretty-printing rendered SQL. In order to obtain pretty-printed SQL, just use the following custom settings: www.jooq.org Spring의 webConfig 클래스에 아래와 같이 Bean을 ..

DataBase/SQL

[SQL/쿼리 튜닝] 조인조건 변경을 통한 속도 개선

아래 조인 조건을 보자. AS-WAS : 조인조건에서 ACCOUNT 테이블 조인 조건에서 OR을 사용하여 실행계획 cost가 매우 높게 나옴. AS-IS : select로 각각 분리하여 조인으로 변경. account 테이블 6000만건 이상 조회시. 5분 소요되는 것을 3초로 단축. index를 스캔하지 않던 조건을 index를 타도록 변경한 사례. 결과적으로 아래와 같은 쿼리로 실행.

DataBase/SQL

한 컬럼에 대해서 두 개 이상의 조건을 적용하는 쿼리

테이블을 조회하다보면 한 컬럼에 두개 이상의 조건을 걸어야 할 때가 있습니다. 예를 들면 아래와 같습니다. ex) 구매일이 '2021-04-01' 이전과 이후 데이터를 모두 가지고 있는 회원 데이터를 조회 하려면? SELECT * FROM member_order m1 INNER JOIN member_order m2 ON m1.id = m2.id AND m1.buy_date > '2021-04-01' AND m2.buy_date

DataBase/JOOQ

[JOOQ] Update 시, 조건에 따라 업데이트 컬럼을 추가. add update column by condition.

UpdateSetMoreStep 을 사용하면 된다. public void updateAccount(UserSession user, AccountDTO dto) { // Before DSL.update(ACCOUNT) .set(ACCOUNT.USER_NAME, dto.getUserName()) .set(ACCOUNT.ADDRESS, dto.getAddress()) .set(ACCOUNT.UPDATE_USER_ID, user.getId()) .where(ACCOUNT.ID.eq(dto.getAccountId())) .execute(); // After. apply UpdateSetMoreStep UpdateSetMoreStep updateSets = DSL.update(ACCOUNT) .set(ACCOUNT..

DataBase/My-Batis

[MyBatis/MySQL] Result Map을 조심 하세요.

- 문제 상황이 발생했다. 어떤 데이터를 조회하는데 일부가 누락되어 조회되는 상황발생. - 어떤 select 쿼리에 아래와 같이 limit 100이 적용 되 있다. pageable이 null 일 경우 조회결과에 limit 100을 건다. limit가 없을 시 해당쿼리의 실행결과가 122건이라고 할 때, limit가 적용되 있으면 몇건을 반환할까? limit 100 이니까 당연히 100건인것 같지만, 현실은 24건을 반환한다. 원인은 result Map 이 적용되 있기 때문. resultMap이란 결과값을 map에다 담아주는 역할을 함. resultMap을 찾아가보자. 해당 resultMap의 안에서 collection 작업을 통해서 grouping 해주기 떄문에 100개의 row가 24개로 결과가 나오게..

DataBase/My-Batis

[MyBatis/MySQL] 쿼리 작성시 Tip 모음

- 일반적인 SQL문과 마찬가지로 컬럼명 대소문자 상관없이 값을 조회, 수정 가능.

DataBase/My-Batis

Delete 문에 이상이 없어보이는데 Syntax 에러.

java.sql.SQLSyntaxErrorException : You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1. 이라는 에러가 났다. 로그를 보면. Mapper에서 실행된 SQL문은 문제가 없어 보인다. 문제가 없어보인다고?... 자세히 봐바... {#id} 가 아니라 #{id} 잖아.... .... 이 문제 때문에 1시간을 소비했다.. 이런저런 설정 변경하고 구글링 하고.. 로그를 천천히 보도록 하자...

PCOSPD 100LRE SCRIE4A2
'DataBase' 카테고리의 글 목록