[Mysql] Json의 중복되는 key 의 value값을 합산하는 방법

제제·2023년 2월 20일
0
post-thumbnail

DB version: Mysql 10.6

일 하던 도중 특정 한 페이지를 로딩만 하면 GC Overhead 에러가 발생하는 일이 나타났다.
OutOfMemoryError: GC overhead limit exceeded

디버그를 확인하니
DB값을 JqGrid로 뿌리는 과정에서 jqgrid의 특정 한 컬럼의 값을 집계내기 위하여
해당 row에 연관이 있는 부가적인 데이터(굳이 이 페이지에서 가져오지 않아도 되는 데이터를..)
적게는 1개 많게는 30개씩 해당 DB row의 전체 Column을 조회하여 JsonArray에 넣는 극악무도한 로직이 있었다.
아무리 json안에 json 값을 가져오기 귀찮았어도 이걸 row 통째로 가져와 java에서 처리하다니

이는 JVM 힙 메모리에 큰 무리가 됐고, 그 결과는 CPU 사용량 100%를 달성하며 WAS가 먹통이 되어 재시작을 해야하는 최악의 끔찍한 사태를 초래했다.

아래는 위 현상을 해결하기 위해 불필요한 데이터를 가져오지 않고
DB에서 해당 값을 합산하여 가져오는 방법을 채택하였다.

물론 최적의 방법이 아닌 해결할 수 있는 방법 중 하나이며
혹은 mysql에서 json의 value 안에 있는 json에서 중복되는 key의 value값을 합치는 방법이다.

이게 한 리스트에 있는 부가적인 JSON데이터이며 1개 혹은 n개 그 이상이 될 수 있다.

{
  "Name":"foo",
  "Size":"26",
  "TestValue":[{"count":"0","pattern":"a"},
             {"count":"1","pattern":"b"},
             {"count":"0","pattern":"c"},
             {"count":"0","pattern":"d"},
             {"count":"0","pattern":"e"},
             {"count":"0","pattern":"f"}
	]
}

n개일때는 한 칼럼에 {...},{...},{...}의 JSON 으로 들어있는게 아닌 각각의 독립적인 로우에 값이 들어있다.

Sample DB의 구조는 이러하다

TableA
NO COLUMN
1 JSON 1
1 JSON 2
2 JSON 1
2 JSON 2
2 JSON 3
2 JSON 4

이 A 테이블에 있는 NO 2의 JSON 1,2,3,4 데이터의 count를 전부 sum 하여 total 값만 출력하기 위해선

위 json 값중 pattern의 json value를 json_table로 임시 테이블을 만들고
TestValue의 모든 json value에 대하여 count와 pattern을 각각의 column으로 설정하여 sum(b.count) 하면 된다.
위 쿼리는 각각의 row의 count를 합친 값으로

NO.2에 대한 총 count를 하고싶다면 group by 절을 빼면 된다.

끝 !
설명이 중구난방에 빈약하며 최선의 방법이 아닐 수 있기에
더 나은 방법 혹은 더 좋은 쿼리가 있다면 언제든 댓글에 달아주시면 감사합니다!

profile
천방지축 어리둥절 빙글빙글 돌아가는 초보 개발자 제제의 일지

0개의 댓글