我正在为我的应用程序使用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
?
答案 0 :(得分:2)
有没有办法强制查询 使用varchar而不是nvarchar?
您必须修改SubSonic的源代码才能更改此行为。
答案 1 :(得分: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”。也许作者认为这无关紧要。我建议你试一试(但它可能会破坏单元测试)。