문제 상황
디비버에서 쿼리를 조회할 때 보다 로컬을 실행해 화면에서 조회할 때 시간이 훨씬 오래걸렸다.
단순히 노트북 사양 문제인가 했는데, SQL Server 문제일 수도 있는 부분을 수정하니, 속도가 일부 개선되었다.
SQL Server JDBC Driver는 String type의 파라미터를 기본적으로 NVARCHAR로 매핑한다.
이 경우 VARCHAR 타입의 컬럼인데 VARCHAR가 아닌, NVARCHAR로 인식되기 때문에 인덱스를 타지 않고 성능저하가 발생하게 된다.
MS 공식문서에 따르면 데이터 형식 우선순위가 있다고 한다.
그래서 우선순위가 높은 쪽으로 묵시적 형변환이 일어나는 것이다.
일전에 다른 문제에서 접한 적이 있는데, 아래와 같은 쿼리를 작성했을 때
WHERE 123 = '123'
우선순위가 높은 INT형으로 '123'이 자동 형 변환이 일어난다.
만약, 아래와 같이 서로다른 타입의 컬럼을 비교하는 쿼리가 작성된다면
WHERE COL1 = COL2
보통 우선순위를 외우진 못하고, 나도 이전엔 고려하지 못 했으니
어떤 컬럼이 묵시적 형변환이 발생할 지 알 수 없고, 그로인해 인덱스를 타지 못하게 된다면 성능저하가 발생하게 된다.
일하면서 내내 배운 명시적 형변환이 중요한 이유다.
그렇기 때문에, String 타입의 파라미터를 기본 VARCHAR로 매핑하고 싶다면, JDBC URL에
<Resource ... url="sendStringParametersAsUnicode=false;" ... />
를 추가해야한다.
MS_SQL 에서 쿼리가 너무 늦게 나가요…
쿼리에 인덱싱을 걸어서 사용하였음에도 불구하고 DB 속도가 너무 늦게 나오네요 분명 DB tool 에서 조회시에는 느리지 않았는데..그래서 검색 해본결과 MS_SQL 은 성능을 추적 할 수 있는 도구가 있
gangda.tistory.com
https://techblog.woowahan.com/2605/
SQL Server 에게 String 이란? (NVARCHAR 인가 VARCHAR 인가) | 우아한형제들 기술블로그
SQL Server JDBC Driver 를 사용하면서 배운, 그리고 주의해야 할 특징 안녕하세요. 비즈상품개발팀에서 광고시스템을 개발하고 있는 김승영입니다. 현재 광고시스템의 일부분이 Spring Boot / JPA 기반에
techblog.woowahan.com
데이터 형식 우선 순위(Transact-SQL) - SQL Server
Transact-SQL의 데이터 형식 우선 순위에 대해 알아봅니다.
learn.microsoft.com
'회사 > DB' 카테고리의 다른 글
[MSSQL] CROSS APPLY, OUTER APPLY (0) | 2025.02.04 |
---|---|
[DB] Index와 Column, 비교연산자 (0) | 2024.12.16 |
[DB / MSSQL] / SELECT - INTO (0) | 2024.11.06 |
[DB / MSSQL] LOB (Large Object / 대형 오브젝트) (0) | 2024.10.29 |
[DB / MSSQL] 날짜조회 BETWEEN (1) | 2024.10.28 |