MSSQL 쿼리 성능 검토

개발서버와 운영서버에서 동일한 조건에서의 수행시간이 차이가 많이 납니다.

테이블 설계는 PK라든지 index가 모두 동일하게 되어 있습니다.

데이터 건수는 1700만건의 테이블에서 26만건 정도 차이가 나긴 합니다.

쿼리를 수행해보면 운영서버에서는 최대 48분에서 최소 30분 정도 걸리는 쿼리가 개발계에서는 최대 55초 최소 20초 정도에 끝납니다.

 

이렇게까지 쿼리 속도에 영향을 주는 요인이 뭐가 있을까요?

운영서버에는 다름 시스템에서 DB 컨넥션이 좀 있긴 하지만 이런 요인들이 쿼리 수행속도에 이만한 차이를 가져올 수 있는 건가요?

어디를 살펴봐야 하는지 답변 부탁 드리겠습니다.

 


 

관련사항에 영향을 주는 요소가 너무 많아서 직접보지 않으면 정확한 판단이 어렵긴 하지만 몇가지 체크해보셔야 할 사항만 거론해 보겠습니다.

H/W

  1. CPU갯수, 메모리SIZE, DISK 사용량

CONFIG

  1. 병렬처리 임계값 – 빅테이블처리라 병렬처리가 될거같은데, 실서버는 CPU1장이 테스트는 CPU여러장이 처리하는지…

  2. FILEGROUP의 위치. – 파일이 물리적으로 같은 디스크에 있어서 디스크 병목은 아닌지…

SQL

  1. ISOLATION LEVEL – 잠금이슈일거 같습니다. WITH (NOLOCK) OR WITH (READUNCOMMITTED)
    MSSQL에서는 기본적으로 ROW VERSIONING을 하지 않습니다.
    따라서 모들 쿼리테이블다음에 WITH (NOLOCK)을 삽입하세요. 또는 세션상에서 잠금레벨 설정해 주세요.

EX)
1. SELECT * FROM TBLX WITH(NOLOCK) WHERE ~.
2. SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; SELECT * FROM TBLX WITH(NOLOCK) WHERE ~.

  1. 실행계획이 정말로 동일한지…

  2. IOT의 클러스터링 인덱스가 동일한지

  3. Parameter Snipping 현상일수도 있습니다. (통계정보를 갱신하시고,) 변수값으로 테스트 해보시지말고 상수값으로 실행해보세요.

통계정보확인

  1. 해당 테이블들의 인덱스 통계정보를 확인해보세요. – 최신으로 업데이트 해주세요.

  2. 인덱스 조각화 상태를 확인해서 페이지 밀도율을 올려주세요.
    SHOW CONTIG(‘테이블명’); 하시면 밀도율 정보가 나오는데, 보통 80%이하로 떨어지면
    인덱스로 인한 성능이슈가 발생할 수 있습니다.

Advertisements

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

%s에 연결하는 중