2011-03-16 4 views
0

내 애플리케이션에 SubSonic SimpleRepository 템플릿을 사용하고 있습니다. VS2010에서 SQL 2000 데이터베이스를 가리키는 ASP .NET WebForms 프로젝트를 만들었습니다.SubSonic - SQL 대신 Seek 대신 인덱스 스캔을 발생시키는 varchar 대신 nvarchar를 사용합니다.

SubSonic이 varchar 대신 매개 변수가있는 쿼리에서 항상 nvarchar를 사용하는 문제가 있습니다. 이렇게하면 SQL이 인덱스 검색 대신 인덱스 검색을 수행합니다. 프로필러에서 SQL을 가져 와서 테이블의 필드와 같은 매개 변수 varchar를 만들도록 변경했으며 매우 빠르게 실행됩니다 (< 1 초 vs. 8 초).

exec sp_executesql N'SELECT [t0].[ADDRESS_L1], [t0].[ADDRESS_L2], [t0].[ADDRESS_L3], [t0].[CITY], [t0].[COUNTRY] FROM [aveadmin].[SAPADD] AS t0 WHERE (([t0].[SITE_ID] = @p0) AND ((([t0].[ADDRESS_TYPE] = @p1) AND 1 <> 0) OR (([t0].[ADDRESS_TYPE] = @p2) AND 0 <> 0)))', N'@p0 varchar(16),@p1 varchar(2),@p2 varchar(2)', @p0 = N'BCF8A0A27E543EE1', @p1 = N'00', @p2 = N'03' 

SITE_IDADDRESS_TYPE 음속 질의 프로파일에서

exec sp_executesql N'SELECT [t0].[ADDRESS_L1], [t0].[ADDRESS_L2], [t0].[ADDRESS_L3], [t0].[CITY], [t0].[COUNTRY] FROM [aveadmin].[SAPADD] AS t0 WHERE (([t0].[SITE_ID] = @p0) AND ((([t0].[ADDRESS_TYPE] = @p1) AND 1 <> 0) OR (([t0].[ADDRESS_TYPE] = @p2) AND 0 <> 0)))', N'@p0 nvarchar(16),@p1 nvarchar(2),@p2 nvarchar(2)', @p0 = N'BCF8A0A27E543EE1', @p1 = N'00', @p2 = N'03' 

수동으로 수정 질의 varchars이다. nvarchar 대신 varchar을 사용하도록 쿼리를 강제로 수행 할 수 있습니까?

답변

2

쿼리를 강제로 수행하는 방법이 있습니까 nvarchar 대신 varchar를 사용 하시겠습니까?

이 동작을 변경하려면 SubSonic 소스 코드를 수정해야합니다.

+0

원본을 다운로드했으며 주변을 파기 시작할 것입니다. 필드가 varchar 일 때 항상 nvarchar 매개 변수를 사용하는 이유는 무엇입니까? – jamorgan

+0

어딘가에 하드 코딩 된 것 같습니다. 그것은 꽤 간단한 라이브러리입니다. 아마 모든 char 필드에서 사용하고 있습니다. 더 큰 성숙한 라이브러리 (NHibernate 나 EF와 같은 완벽한 라이브러리가 아닌)에서 자세한 최적화를 수행하지는 않았습니다.). –

0

[이전 정답 인 - 더 상세 따른다.]

NVARCHAR의 사용은 하드 코딩 Sql2005Schema.cs에 GetNativeType()이라고하는 기능이다. 패치하고 다시 작성하기는 쉽습니다. 이봐, 여긴 OSS 야! 이것은 소스 코드를위한 것입니다!

다음은 코드입니다.

  case DbType.AnsiString: 
      case DbType.AnsiStringFixedLength: 
      case DbType.String: 
      case DbType.StringFixedLength: 
       return "nvarchar"; 

은 이론적으로 생성 된 코드 (SQLServer.ttinclude 참조) 실제로 별도의 유형으로 DbType.AnsiString 및 DbType.String를 생성한다. switch 문을 분할하여 하나는 "varchar"를 생성하고 다른 하나는 "nvarchar"를 생성 할 수 있어야합니다. 어쩌면 저자는 그것이 중요하지 않다고 생각했을지도 모른다. 나는 당신이 그것을 시도해볼 것을 제안한다. (그러나 그것은 단위 테스트를 깰지도 모른다).

관련 문제