티스토리 뷰

선언된 쿼리가 굉장히 복잡한데 거기에 GROUP_CONCAT과 ORDER BY까지...

데이터가 많아질수록 느려지다가 결국...

the memory size allocated for the statement has exceeded the maximum limit

이런 에러를 내뱉으면서 살려달라고 한다.

그래서 GROUP_CONCAT이 필요한 부분만 따로 쿼리를 만들었고,

JAVA에서 두 리스트를 불러와 하나로 합치는 작업을 진행했다.


두 리스트가 공통된 부분을 기준으로 비교해야하는데 그러려면 이중 for문을 사용해야했다.

이중으로 돌면 데이터가 많아질수록 느려질 것 같아서 최소로 for문을 돌리는 방법을 생각했는데


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
    private List<ItemVO> itemList(ItemVO vo){
 
        List<ItemVO> list = new ArrayList<>();
        List<ItemVO> newList = new ArrayList<>();
    
        list = itemDAO.selectItemList(vo);
 
        int index = 0;
 
        newList = itemDAO.selectNewItemList(vo);
 
        Loop1 : for(ItemVO listVo : list) {
            for(int i = index; i < newList.size(); i++) {
 
                if(listVo.getSeq().equals(newList.get(i).getSeq())) {
 
                    listVo.setItemNm(newList.get(i).getItemNm());
                    listVo.setPrice(newList.get(i).getPrice());
                    index = i;
                    continue Loop1;
 
                }
            }
        }
            return list;
    }
cs


list 에는 item list를 불러왔고,

newList 에는 new item list를 불러왔다.

두 쿼리를 LEFT JOIN 했다면 ON 부분에 들어가야 할 기준 값은 Seq이다.

두 쿼리는 ORDER BY SEQ DESC를 적용해 둘다 큰 값부터 불러온다.


우선, 첫 for문에 Loop1이라는 이름을 붙였다.

두 seq가 일치한다면 바로 첫 for문으로 이동해 다음 값을 검색하기 위해서 continue Loop1을 if문 마지막에 구현했다.


다음으로, 두 seq 모두 ORDER BY를 적용해서 불러왔기 때문에 해당 값을 찾으면 이전 값은 더 이상 비교하지 않아도 된다.



그림으로 보면 두 배열 혹은 리스트가 같은 순서로 정렬이 되있단 가정하에,

2를 탐색했으면 해당 for문이 끝나고 다음 숫자인 5는 그냥 중첩 for문으로 돌리면 처음 1부터 탐색한다. (회색 실선 부분)

하지만 순서대로 정렬되어 있기 때문에 이전 값들을 탐색하는건 불필요하다고 생각했다.

그래서 index를 만들어 다음 숫자인 5는 탐색이 완료된 2 이후부터 탐색하도록 했다.

(index = i + 1 해야하는데...)


짧은 코드를 끝으로 마무리!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class Main {
 
    public static void main(String[] args) {
        int index = 0;
        int[] array = new int[3];
        array[0= 2;
        array[1= 5;
        array[2= 8;
        
        Loop1 : for(int i = 0; i < array.length; i++) {
            for(int j = index; j < 10; j++) {
                if(array[i] == j) {
                    System.out.println(array[i]);
                    index = j + 1;
                    continue Loop1;
                }
            }
        }
    }
}
cs



댓글