MSSQL iBatis PreparedStatement 속도저하/ 성능문제.
Posted 2013. 6. 17. 21:19mssql + iBatis 를 사용하는 프로젝트에서 이유도 없이 쿼리 실행결과가 느려지는 현상이 발생했습니다. 그것도 1,2 초가 아닌 10초 이상이나 걸립니다. 데이터가 많아서도 아닙니다. 1만건도 안됩니다. 게다가 쿼리문을 Tool을 이용해서 직접 실행시켜보거나 테스트 페이지 만들어서 실행시켜보면 1초 미만으로 결과값을 반환합니다.
iBatis를 사용하는 환경에서만 유독 발생하는 아주 고약한 원인을 알수 없는 문제입니다.
일단 구글링 결과를 토대로 한 현재까지의 원인 분석 및 해결방법은 다음과 같습니다.
원인 : JDBC PreparedStatement, MSSQL 과의 궁합문제. 또는 MSSQL 내부의 형변환 문제.
해결방법 : 문제가 되는 쿼리를 찾아서 PreparedStatement 를 statement로 변경해 줍니다. (완전 간단하죠? ㅠ.ㅠ;;;)
#member_key# ==> '$member_key$' (문자열이기에 '' 으로 했습니다.)
하지만 완전한 해결책은 아니기에 뒷끝이 좀 찝찝합니다.
" JDBC 의 PreparedStatement 를 사용한 경우 MS-SQL 성능과 관련된 문제입니다.
MS-SQL JDBC 의 대부분은 PreparedStatement 를 처리할 때, 스토어드 프로시져 형태로 처리를 합니다. 이 경우, 입력받는 파라메터 중 String 때문에 문제가 발생하는데...
Java 의 String 은 16-bit 캐릭터이며, 이는 MS-SQL 의 nvarchar 유형과 일치하므로, 내부적으로 String 파라메터를 nvarchar 유형으로 처리하고자 합니다.
다행히 DB Table 이 nvarchar 유형이라면, 문제가 발생하지 않지만 varchar 라면 해당 테이블의 해당컬럼이 인덱스가 생성되어 있더라도 테이블의 해당컬럼이 nvarchar 로 변환됨으로 인해서 인덱스를 사용하지 못하게 되어(컬럼의 형변환 되면 인덱스를 사용할 수 없음) "
그래서 성능문제가 발생하게 된다고 합니다.
2013. 06. 17. 추가.
추가로 몇가지의 테스트를 시도 해 보았습니다.
1. JDBC Driver 변경
MS-SQL에서 제공한 JDBC Driver가 문제인가 싶어서 jtds1.2.7 로 동일한 테스트를 해보았습니다.
(제 개발환경이 jdk1.6까지라서 최신 드라이버인 jtds 1.3.1은 사용할수 없었습니다.)
==> 결과는 동일하게 나타났습니다.
2. DB Table Column Type 변경
위의 내용대로라면 DB Table column 을 nvarchar type으로 변경할 경우 속도문제가 해결되어야 하는게 맞습니다.
하지만 column type을 변경해도 속도문제는 여전히 개선되지 않아보입니다.
점점 미궁으로 빠져드는 그런 상황이네요...
'개발노트' 카테고리의 다른 글
Maven ojdbc14.jar 등록오류 해결하기. (0) | 2013.06.20 |
---|---|
Spring + WAS 기동시 ContextLoaderListener ClassNotFoundException (1) | 2013.06.19 |
redmine + apache + svn 연동시 프로젝트별 권한 제어하기 (0) | 2013.05.29 |
Running Tomcat Multi-Instance on single machine (0) | 2013.04.05 |
nGrinder를 이용한 Stress Test 따라하기(Basic 설치편) (0) | 2013.02.15 |
- Filed under : 개발노트