1주일 회고(2/25~3/03)

2 minute read

1주일 회고(2019-02-25~2019-03-03)

  • Clustered Index Scan
  • 긴급출장

Clustered Index Scan

점심즈음 경주 근무자를 통해서 쿼리의 응답 시간을 개선하는 패치를 진행했다.

정확히는 지난주에 개선한 문서 목록 조회서비스에서 LIKE 쿼리가 추가되면 말도안될만큼 성능 저하가 발생하는것을 확인했다. 운영서버의 DB내의 데이터가 많아지면서 드러난 문제로, 데이터가 적은 개발 서버에서는 3초, 운영서버에서는 무려 40초가 걸리는 상태였다. 실행 계획을 참고하니 Clustered Index Scan 이 비용의 대부분을 잡아먹고 있었다.즉 인덱싱 안된 컬럼을 조회하려니 테이블 내의 레코드를 모두 검색하게 되고 응답 시간이 늘어지는 문제가 발생하는것.

재미있는점은 LIKE 검색을 하지 않으면 Clustered Index Scan 이 발생하지 않는다는 것이다. 어떻게 하면 해결할 수 있을까 이리저리 고민하였다.

  • 인덱스를 추가해본다.
  • 쿼리를 갈아엎는다.
  • LIKE 절의 위치를 옮겨본다.

우선 인덱스를 추가하는 방법은 옮지 않다고 판단하였다. 딱히 인덱스를 걸만한 컬럼도 없을 뿐더러 LIKE 절의 대상이 되는 컬림이 유동적이였기 때문이였다.

그렇다면 쿼리를 갈아엎는 방법은 어떠한가? 갈아 엎고 새로 작성한다면 좀 나아질지도 모르겠지만 시간이 너무 많이 소요되는 방법이였다.

결국 LIKE 절의 위치를 옮기기로 하였다.

LIKE 절이 붙는 위치를 맨 마지막으로 옮기니(이전에는 중간단계에 위치했었다.) 결과는 성공적이였다. 동일한 결과를 리턴하면서도 Clustered Index Scan이 발생하지 않는것이였다. DB 지식이 더 풍부했다면 왜 이런일이 발생하는지도 알았을텐데 당시에는 몰랐지만 지금 회고를 쓰니 씁쓸하다. 무튼 LIKE 절을 맨 마지막으로 옮기고 테스트를 거친뒤 경주 근무자를 통해 패치를 진행하기로 하였다. 발주처에서 빨리 개선해 달라고 했기 때문이였다.

긴급 출장

코드를 경주 근무자에게 보내고 점심시간에 잠시 서버를 중단시킨후 반영하기로 하였다. 내가 직접하는게 아니라 경주 근무자를 통해서 하는것이지만 매우 간단한 절차이기에 점심을 먹기위해 구내식당으로 향했다. 밥을 먹고나서 회사 근처 까페에서 커피타임을 가지고 있었다. 커피를 느긋하게 즐기려는 찰나 경주 근무자로부터 텔레그램 메시지가 왔다.

503 메시지가 뜹니다.

메시지를 확인하자마자 깊은 한숨이 절로 모르게 튀어나왔다. 바로 본사 사무실의 내 자리로 달려갔다. 그후 경주 근무자와 서버의 여러 사항들을 점검하였다.

  • IIS는 동작하고 있는가?
  • POOL은 살아있는가?

확인결과 IIS 자체는 동작하고 있으나 무슨 이유에서인지 POOL이 동작을 하지 않고 있었다. 암만봐도 POOL설정에는 이상이 없었다. 그러다 경주 근무자가 에러 로그를 하나 보내줬다.

‘처리되지 않은 예외: System.BadImageFormatException: 프로그램을 잘못된 형식으로 로드하려고 했습니다.

순간적으로 뭔가가 스쳐지나갔다. 점심시간에 머지한 코드가 제대로 머지가 되었는지 확인하지 않은것이다. 경주 근무지(차단망)에도 별도의 SCM이 존재하기 때문에 코드를 머지->빌드를 해야하는데 여기서 뭔가가 잘못된것이리라.

경주 근무자를 통해 Plastic SCM의 브런치 상태를 보아하니 한눈에 뭔가가 잘못된것이 들어왔다. 머지 링크 색상이 초록색이 아닌 보라색이였다.

참고로 Plastic SCM에서 일반적인 머지를 진행했다면 초록색 LINK표시를 하고 Cherry Pic 머지를 하게되면 보라색 LINK가 표시되는데 이 보라색이 나타난것이였다. (참고로 경주 근무자는 개발자가 아니다.) 머지를 잘못하여 코드가 꼬인것이다. 더이상 경주 근무자를 통해 처리할 수 있는 문제가 아니라는것을 확인하여 팀장님에게 보고후 바로 대전->경주로 날아갔다. 출발한 시점에서 서버가 다운된지 이미 3시간이 지났기 때문에 상황은 급박했다.

현장 도착후 확인 결과 Cherry Pic으로 인해 과거 삭제되었던 잘못된 DLL이 들어가버려 POOL이 기동하기위해 DLL을 읽으려는 찰나 잘못된 DLL을 읽게된 것이였다. 서버는 정상화 되었다. 확인에 걸린 시간은 30분. 결국 다음날 아침에 복귀하게 되었다. 끝

지난 한주를 통해 배운것.

  • 쿼리를 생성할때는 최대한 인덱싱된 컬럼을 활용할것.
  • 불필요한 컬럼은 Select절에 쓰지 말것.
  • 돌다리도 두들겨보자.
  • 열심히 공부하자.

Updated:

Leave a comment