파란하늘의 지식창고
반응형
어떤 테이블의 varchar 타입 컬럼을 검색하는 SP를 작성할 경우 아래와 같이 작성하곤 한다.

CREATE PROCEDURE [dbo].[searchA]
	@searchColumnA NVARCHAR(12)
AS
SET NOCOUNT ON
SELECT * FROM A WITH (READUNCOMMITTED) WHERE columnA = @searchColumnA

이 쿼리를 직접 테스트 할 때 이상없더라도 SP로 호출하면 급격히 느려질 수 있다.

이유는 varchar로 된 고정 길이의 columnA을 검색하기 위해 입력한 @searchColumnA에 대해 매번 테이블을 조회하는 경우 CONVERT 과정이 더해지기 때문이다.

이는 데이터 형식의 선행 규칙에 의해 이루어지며 자세한 내용은 아래 링크를 통해 알 수 있다.
http://msdn.microsoft.com/ko-kr/library/ms190309(SQL.90).aspx

문제는 검색에 사용된 nvarchar 형식보다 varchar형식의 선행 규칙 우선순위가 낮으므로 where 구문의 왼쪽 조건절에 대한 convert가 일어나게 되어 해당 테이블의 열이 많으면 많을 수록 검색시 convert로 인한 부하가 증가하게 되는 것이다.
SELECT * FROM A WITH (READUNCOMMITTED) WHERE CONVERT(NVARCHAR(12), columnA) = @searchColumnA
위와 같은 왼쪽 조건절 convert 쿼리로 변환되어 속도가 급속도로 저하된다.

선행 규칙은 다음과 같다.
  1. 사용자 정의 데이터 형식(가장 높음)
  2. sql_variant
  3. xml
  4. datetime
  5. smalldatetime
  6. float
  7. real
  8. decimal
  9. money
  10. smallmoney
  11. bigint
  12. int
  13. smallint
  14. tinyint
  15. bit
  16. ntext
  17. text
  18. image
  19. timestamp
  20. uniqueidentifier
  21. nvarchar(nvarchar(max) 포함)
  22. nchar
  23. varchar(varchar(max) 포함)
  24. char
  25. varbinary(varbinary(max) 포함)
  26. binary(가장 낮음)
반응형
profile

파란하늘의 지식창고

@Bluesky_

내용이 유익했다면 광고 배너를 클릭 해주세요