내 애플리케이션에 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_ID
및 ADDRESS_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
을 사용하도록 쿼리를 강제로 수행 할 수 있습니까?
원본을 다운로드했으며 주변을 파기 시작할 것입니다. 필드가 varchar 일 때 항상 nvarchar 매개 변수를 사용하는 이유는 무엇입니까? – jamorgan
어딘가에 하드 코딩 된 것 같습니다. 그것은 꽤 간단한 라이브러리입니다. 아마 모든 char 필드에서 사용하고 있습니다. 더 큰 성숙한 라이브러리 (NHibernate 나 EF와 같은 완벽한 라이브러리가 아닌)에서 자세한 최적화를 수행하지는 않았습니다.). –