이 정도 진행되었다면 사용자의 목소리, 개발자의 목소리는 어느 정도 들었을 것이다. 이제 어떤 부분에서 병목이 있는지 파악할 필요가 있다. Microsoft 기술지원부에서는 병목지점 파악을 위한 2개의 저장 프로시저를 제공한다. 이 프로시저는 MSSQL Server의 Wait Type을 수집하는 것이다. 수집된 정보를 가지고 분석한다.
CXPACKET
CXPACKET는 Parallel Process 대기유형이다. 이것은 Parallel Query에 실행 시 각 Process가 실행되는 구간에 Lock Issue가 있을 수도 있음을 의미하거나 특정 하드웨어의 병목으로 인해 다른 Process가 대기하고 있는 Process가 끝날 때까지 대기하고 있을 수도 있음을 의미한다. DBMS가 올바른 판단을 하여 병렬처리를 했는지 아니면 환경을 만들어주지 않아서 할 수 없이 병렬처리를 하는 것인지 잘 판단해야 한다.
PAGEIOLATCH_SH
PAGEIOLATCH_SH는 SELECT 쿼리 시 Shared Latch를 얻기 위해 대기하고 있음을 의미한다. Latch의 개념은 다음과 같다. (Disk-to-Memory transfers)
클라이언트의 요청에 따라 관계형 엔진은 OLEDB API를 이용하여 데이터의 요청을 하게 된다. 이 요청에 따라 저장소엔진은 Latch를 얻고, 관계형 엔진으로 전송한 다음 Latch를 해제한다. (메모리 보호 목적, 메모리에 캐시된 Page를 고치는 쓰레드(?)는 1개이어야 한다. 디스크에서 메모리로 데이터를 올리는 도중에 메모리의 page를 읽으면 안되기 때문에 완전히 디스크에서 메모리로 데이터를 적재하기 전까지는 다른 요청은 대기해야 한다. 이게 latch wait 이다)
WRITELOG
로그를 쓰기 위해 대기하고 있는 시간. Disk의 쓰기 성능에 직접영향을 미침. Temp Table을 생성하여 Temp Table에 Insert, Delete, Update 작업을 하거나 Table에 이러한 작업이 많이 일어난다면 병목지점이 될 수 있다.
LATCH_EX
LATCH_EX는 배타적인 LATCH를 얻기 위해 대기하는 시간
NETWORKIO
NETWORKIO는 Network Input/Output에 대기하는 시간. NIC의 Bandwidth를 체크해야 한다.
LCK_M_S
Latch를 얻은 동안에는 다른 프로세스가 페이지의 변경 등을 하지 못하도록 Lock을 걸게 되는 것이다. 그러므로 Latch를 얻고 Latch를 해제할 때까지의 시간이 빠르면 빠를수록 성능은 증가된다. 즉, Memory와 Disk간에 데이터 전송이 빠르다면 LCK_M_S, PAGEIOLATCH_SH의 대기 시간은 줄어들 것이다.
IO_COMPLETION
IO_COMPLETION는 I/O 요청을 완료하는데 대기하는 유형을 말한다. Query Plan이 나쁜 경우 발생하는 대기 유형으로 Full Scan, Index Scan이 일어나는 쿼리에 대한 Query Plan 조정이 필요하다.
PAGEIOLATCH_EX
PAGEIOLATCH_EX는 LATCH_EX 대기 유형과 함께 일어나는 대기 유형이다.
분석요약
수집된 데이터로 보아 CXPACKET, PAGEIOLATCH_SH 대기유형이 70% 이상을 차지 하고 있다. 살펴보아야 할 것은 이 시간대에 큰 작업이 일어났는지에 대한 것과 블록킹에 대한 이슈이다. 만약 실행계획이 잘못되어서 쿼리를 수행하는 총 비용이 MSSQL Server에서 설정한 값(기본값:5)보다 더 크다면 병렬쿼리를 수행할 것이다. 중요한 것은 과연 병렬쿼리가 필요한가에 대한 평가이다. 또한 Latch에 대한 대기유형도 만만치 않다. 이 의미는 두 가지로 해석해 볼 수 있다. 즉, Memory 부족이거나 Disk I/O 성능에 관련된 것이다. 물론 H/W의 관점에서만 보면 그렇다. 어플리케이션이 제대로 작성되었는지의 여부를 판단 후 Memory와 Disk I/O에 대해서 살펴보아야 할 것이다.
로그를 쓰는 것도 약 9%의 대기유형을 보였다. 트랜잭션에 대한 로그를 기록하기 위해서 프로세스가 대기한 비율이 약 9%라는 것이다. 이것으로 보아도 Disk에 뭔가 안 좋은 구성이 있을 수 있다는 감을 잡을 수 있다. 또한 Disk에 병목이 있음도 알 수 있다. 그러나 중요한 것은 어플리케이션이 최적화되었는지의 여부가 먼저 판단되어야 하는 것이다.