본문 바로가기

성능개선

자동형변환으로 인한 성능 저하

728x90

테이블 구조가 아래와 같습니다.

여기서 중요한 필드가 WayBillNo 이며, varchar 타입 입니다.

sp_help [IF_WayBill_Inbound]

sp_helpindex [IF_WayBill_Inbound]

이런 상황에서 사용자 또는 프로그램이 WayBillNo의 값을 NVARCHAR 즉, N'XXXXXX' 으로 값을 넣어 조회를 할 경우 성능 저하가 발생합니다.

SELECT * FROM [IF_WayBill_Inbound] WHERE WayBillNO=N'0000002087777'

아래 옵션을 켜고 IO를 보도록 하겠습니다.

set statistics io on

(1 row affected)
Table 'IF_WayBill_Inbound'. Scan count 1, logical reads 3182, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

 

실행 계획을 보도록 하겠습니다. 여기서 문제는 아래 빨간 네모칸 입니다. CONVERT_IMPLICIT ( NVARCHAR(50) .... 

비교할 값을 CONVERT 하지 않고, 테이블의 필드를 CONVERT를 하고 있습니다. 이럴 경우 전체 데이터를 모두 CONVERT 한 후 조건 값과 비교를 하기 때문에 INDEX를 사용할 수 없는 상황이 발생합니다.

 

VARCAR와 NVARCHAR 비교시에는 VARCHAR --> NVARCHAR로 자동형 변환이 이루어지기 때문에 위와 같은 현상이 발생합니다.

 

이를 해결하기 위해서는 입력값을 VARCHAR 타입으로 입력하거나 필드를 NVARCHAR로 변경해야 합니다.

SELECT * FROM [IF_WayBill_Inbound] WHERE WayBillNO='0000002087777'

위의 구문으로 수행할 경우


(1 row affected)
Table 'IF_WayBill_Inbound'. Scan count 1, logical reads 3, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

이전과 다른 성능 결과값을 얻을 수 있습니다.

 

테이블을 설계하거나 쿼리를 작성할 때 자동형변환에 대한 기본적인 내용을 알고 작성하시는 것이 중요합니다.

 

728x90

'성능개선' 카테고리의 다른 글

NO_JOIN_THRU_AGGR  (0) 2020.10.05