2

这个 LINQ 表达式:

var result = entities.Cases
            .Where(c => c.House.Address.Contains("otte"))
            .ToList();

在服务器上执行这个 sql:

SELECT 
...
--rows
...
FROM  [dbo].[Case] AS [Extent1]
INNER JOIN [dbo].[House] AS [Extent2] ON [Extent1].[HouseID_FK] = [Extent2].[HouseID]
WHERE [Extent2].[Address] LIKE '%otte%'

这大约需要 100 毫秒才能完成。

这个 LINQ 表达式:

var value = "otte";
var result = entities.Cases
            .Where(c => c.House.Address.Contains(value))
            .ToList();

在服务器上执行这个 sql:

exec sp_executesql N'SELECT 
...
--rows
...
FROM  [dbo].[Case] AS [Extent1]
INNER JOIN [dbo].[House] AS [Extent2] ON [Extent1].[HouseID_FK] = [Extent2].[HouseID]
WHERE [Extent2].[Address] LIKE @p__linq__0 ESCAPE N''~''',N'@p__linq__0     nvarchar(4000)',@p__linq__0=N'%otte%'

这大约需要 1400 毫秒才能完成。

如果我将“value”声明为常量,我也可以让它生成“fast”sql,但我希望能够在运行时更改“value”的值。有什么方法可以强制实体框架不生成“exec sp_executesql” - 样式 sql,因为这显然要慢得多?

4

1 回答 1

1

这里开始,我建议 SQL Server (LINQ/EF) 试图超越您,并且可以告诉您将使用不同的参数重新使用该查询,并且使用 sp_executesql 是当前推荐的方式一致地运行该查询(很确定它是这样 SQL Server 可以有效地缓存查询)。您可能会输掉这一查询,但通过重复使用来弥补损失?

您可以考虑修改数据库以要求简单强制参数化(您想要“强制”),但这可能会导致任何其他查询的性能显着下降,但 YMMV.

我建议避免在 SQL Server 本身中进行任何字符串比较......这些天 RAM 非常丰富,我发现偶尔只提升两个相应的数据集并比较 C# 中的字符串值会更快(再次, YMMV)

如果做不到这一点,请根据您的要求尝试SOUNDEXDIFFERENCELIKECHARINDEX,看看在性能方面是否有任何提升。

祝你好运。

于 2012-09-14T09:34:49.233 回答