Subsonic 亚音速-生成SQL使用nvarchar而不是varchar,这会导致索引扫描而不是搜索

Subsonic 亚音速-生成SQL使用nvarchar而不是varchar,这会导致索引扫描而不是搜索,subsonic,parameterized,Subsonic,Parameterized,我正在为我的应用程序使用亚音速SimpleRepository模板。我在VS2010中创建了一个ASP.NETWebForms项目,指向一个SQL2000数据库 我遇到一个问题,亚音速总是在参数化查询中使用nvarchar而不是varchar。这会导致SQL执行索引扫描而不是索引查找。我从探查器中获取了SQL并对其进行了修改,使参数varchar与表的字段类似,并且执行速度非常快( 有没有办法强制查询 使用varchar而不是nvarchar 您必须修改亚音速的源代码才能更改此行为。[前面的答案

我正在为我的应用程序使用亚音速SimpleRepository模板。我在VS2010中创建了一个ASP.NETWebForms项目,指向一个SQL2000数据库

我遇到一个问题,亚音速总是在参数化查询中使用nvarchar而不是varchar。这会导致SQL执行索引扫描而不是索引查找。我从探查器中获取了SQL并对其进行了修改,使参数varchar与表的字段类似,并且执行速度非常快( 有没有办法强制查询 使用varchar而不是nvarchar


您必须修改亚音速的源代码才能更改此行为。

[前面的答案是正确的,后续将提供更多详细信息。]

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”。也许作者认为这无关紧要。我建议您尝试一下(但它可能会破坏单元测试).

好的,我已经下载了源代码,并将开始深入研究。你知道当字段是varchar时为什么他们总是使用nvarchar参数吗?它可能在那里的某个地方进行了硬编码。这是一个相当简单的库,他们可能在任何char字段中使用它,而且它还没有真正经历过一次详细的优化ht除了来自更大更成熟的库(如NHibernate或EF,并不是说它们是完美的)。
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' 
            case DbType.AnsiString:
            case DbType.AnsiStringFixedLength:
            case DbType.String:
            case DbType.StringFixedLength:
                return "nvarchar";