我正在为我的应用程序使用 SubSonic SimpleRepository 模板。我在 VS2010 中创建了一个指向 SQL 2000 数据库的 ASP .NET WebForms 项目。
我遇到了一个问题,即 SubSonic 在参数化查询中始终使用 nvarchar 而不是 varchar。这会导致 SQL 执行索引扫描而不是索引查找。我从 Profiler 中获取了 SQL 并对其进行了更改,以使参数 varchar 类似于表的字段,并且它执行得非常快(<1 秒对 8 秒)。
来自 Profiler 的 SubSonic 查询
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'
手动修改查询
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
是varchars
。_ 有没有办法强制查询使用varchar
而不是nvarchar
?