250x250
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- DevOps
- spring
- MessageQueue
- ORM
- 자동배포
- rabbitmq
- mssql
- JPA
- Stream
- QueryDSL
- 그리드
- jqGrid
- 엑셀 업로드
- apache.poi
- Jenkins
- 대용량 업로드
- 자동빌드
- 자바8
- JQuery
- Javascript
- poi
- stream api
- mom
- docker
- java
- 보안
- 스트림
- sqlserver
- ci/cd
- 제이쿼리그리드
Archives
- Today
- Total
개발 메모장
[MS-SQL] JDBC 비유니코드 설정 본문
728x90
#. 쿼리의 길이가 길어지고 데이터가 많아질수록 속도는 느려지기 마련입니다.
#. DBMS에선 빠른데 Java를 통해 처리하는 쿼리가 느린 경우가 있었습니다.
- 우선 SQL Server JDBC Driver는 String 타입의 파라미터를 NVARCHAR로 보내어 쿼리를 실행합니다.
- 이 경우 해당 테이블의 필드 타입이 NVARCHAR가 아닌 경우 우선순위에 따라 필드 타입을 형변환하게 됩니다.
- 저의 경우 VARCHAR 필드에 NVARCHAR 데이터를 매핑하다보니 암시적 형변환이 일어나서 JAVA에선 더욱 느리게 느껴졌던 것입니다.
- 그렇다고 기존의 필드를 NVARCHAR로 바꿀수도 없으므로 아래와 같이 문구 하나만 추가해줍니다.
(JDBC 드라이버가 PreparedStatement로 문자열을 보낼 때 Unicode 방식이 아닌 기본 문자셋(ASCII 또는 OS 로케일 기반)으로 전송하도록 설정하는 옵션입니다.)
database.url = jdbc:sqlserver://localhost:8080;database=데이터베이스;sendStringParametersAsUnicode=false
#. sendStringParametersAsUnicode=true 일 때
- default 값은 TRUE
- TRUE일 경우 문자열 파라미터의 문자열을 nvarchar로 전송합니다.
- JDBC 드라이버는 문자열을 Unicode로 처리하게 됩니다.
- NVARCHAR가 VARCHAR보다 처리 우선순위가 높아 VARCHAR 필드에 NVARCHAR 파라미터가 매핑될 경우 필드에 암시적 형변환이 발생하게 되고 INDEX도 깨지게 됩니다.
- 인덱스가 있어도 사용되지 않으므로 성능 저하 발생 (Index Scan 발생)
- 일부 문자 깨짐 또는 매칭 실패 가능성이 있으며 형변환 오류 가능성 상승
- SQL Server가 VARCHAR 필드를 NVARCHAR로 변환하는 작업을 수행하므로 불필요한 CPU 사용
exec sp_executesql N'SELECT * FROM Users WHERE name = @P0',
N'@P0 nvarchar(4000)',
N'홍길동'
-- 내부적으로: CONVERT(nvarchar, N'홍길동') = name
- 이와 같이 쿼리의 파라미터를 NVARCHAR로 변경하여 실행할 경우 아래와 같이 조건자가 형변환하는 모습을 볼 수 있습니다.
- @P0의 타입을 VARCHAR로 변경하면 name 필드의 타입과 동일하기 때문에 아래와 같이 형변환이 이뤄지지 않습니다.
#. sendStringParametersAsUnicode=false 일 때
- 장점
- 문자열을 Unicode가 아닌 일반 문자열 (varchar)로 전송하기 때문에 암시적 형변환이 일어나지 않고 이로 인해 인덱스를 제대로 탈 수 있고 성능이 향상 됩니다.
(필드타입이 NVARCHAR이고 파라미터가 VARCHAR인 경우 우선순위가 낮은 VARCHAR가 형변환이 일어나게 되지만 인덱스는 유지할 수 있습니다.)
- 또한 불필요한 형변환이 일어나지 않기 때문에 CPU 부담이 낮아집니다.
- SQL Server에는 파라미터 값이 N'abc'가 아닌 'abc'와 같은 형태로 SQL로 전송되어 문자비교가 간단해져 대량의 데이터를 조회할 때 속도가 향상될 수 있습니다.
- 단점
- 숫자나 영어를 다루는 경우 장점이긴하나 한글이 포함되게 되면 문자가 깨질 수 있어 반드시 확인이 필요합니다.
- DBMS에서 한글이 깨지는 지는 아래를 통해 SQL server의 코드페이지를 확인해봐야합니다.
SELECT SERVERPROPERTY('Collation') AS Collation;
-- Korean_Wansung_CI_AS 949 (EUC-KR) 기반(문제없음)
-- Korean_Unicode_CI_AS Unicode 기반 (문제 없음)
728x90
- OS에서는 cmd > chcp를 입력해 확인하면 됩니다.
- 필드 타입이 NVARCHAR인 경우 VARCHAR가 형변환이 일어나게되어로 암시적 형변환이 일어나게 되고 인덱스가 깨지고 INDEX SCAN을 유발시킵니다.
- 여러 언어를 지원하는 서비스의 경우 TRUE로 설정하는 것이 좋습니다.
===========================================================
틀린 내용이 있거나 이견 있으시면 언제든 가감 없이 말씀 부탁드립니다!
===========================================================
728x90
'DBMS' 카테고리의 다른 글
[Redis] STS > Redis 적용 예제 (0) | 2024.04.22 |
---|---|
[Redis] Redis CLI 명령어 모음 (0) | 2024.04.12 |
[Oracle] WITH문 사용방법 (0) | 2024.04.08 |
[MS-SQL] 마스킹 Function (0) | 2024.02.06 |
[Oracle] SQL 튜닝 (2) | 2023.12.05 |