#Summary

실시간 사용률이 높은 메인 비즈니스 로직에서

변질된 통계에 대한 잘못된 카디널리티 예상행갯수 으로 인해

쿼리플랜의 일부 연산자가 Scan 연산자로 컴파일되어

과도한 리소스 사용으로 인한 Database Server에 Hang상태를 유발함.


#Problem

Hang상태를 유발한 쿼리는 한개의 부모 테이블을 기반으로 하여금

자식 12개의 테이블, 30번의 Join으로 이루어져 있으며 

문제1
해당 쿼리에서 릴레이션의 대부분은 1:N으로 이루어져 있으나
ResultSet에서 부모 테이블 기준으로 1개의 행당 1개의 행을 만들어 내는 쿼리로

동일 테이블에 대해 1개의 행씩 여러번 조회하여
인덱스에서 동일 리프페이지 탐색 경로에 대한 중복 io가 발생하며

문제2
그러한 테이블 중 한개의 테이블이 
다른 비즈니스 로직 중 잘못 설계된 오퍼레이션으로 인해 

동일한 값을 가지고 삽입/삭제가 빈번하게 발생하여

완벽한 유니크를 보장하지 않는 컬럼을 사용하는 해당 테이블의 인덱스의

통계가 상시 변질되어 있는 상태로


자동 쿼리플랜 재생성 타이밍에

위에 서술한 변질된 통계가 존재하는 테이블 탐색당시

Seek연산으로 인한 카디널리티 예상행 수치로 인해

Full Scan 연산 후 Hash Join을 사용하는 쿼리 플랜이 io, cpu time에

유리하다고 옵티마이저가 판단하여 잘못된 쿼리플랜이 생성되어


해당 쿼리를 실행시 과도한 리소스 사용으로 인해

Database Server의 Hang상태가 발생함

#Solution

문제1에 대한 Solution

- 중복 탐색 최소화를 위한 String_Agg 함수 활용 및 클라이언트 작업자에게 브리핑


문제2에 대한 Solution

안건 1). 인덱스 통계 업데이트 스케줄링

안건 2). 변질된 통계를 유발하는 비즈니스 로직을 리팩토링

안건 3). 해당 테이블을 메인테이블에 역정규화

안건 4). 쿼리플랜힌트로 고정