我看到一些非常奇怪的性能,与使用实体框架代码的非常简单的查询有关-首先使用.NET框架版本4。LINQ2Entities查询看起来像这样:
context.MyTables.Where(m => m.SomeStringProp == stringVar);这需要超过3000毫秒的时间来执行。生成的SQL看起来非常简单:
SELECT [Extent1].[ID], [Extent1].[SomeStringProp], [Extent1].[SomeOtherProp],
...
FROM [MyTable] as [Extent1]
WHERE [Extent1].[SomeStringProp] = '1234567890'当通过Management Studio运行时,此查询几乎是即时运行的。当我更改C#代码以使用SqlQuery函数时,它在5-10毫秒内运行:
context.MyTables.SqlQuery("SELECT [Extent1].[ID] ... WHERE [Extent1].[SomeStringProp] = @param", stringVar);因此,完全相同的SQL,生成的实体在两种情况下都是更改跟踪的,但两者之间存在巨大的性能差异。怎么回事?
发布于 2013-04-03 03:39:05
找到了。事实证明这是SQL数据类型的问题。数据库中的SomeStringProp列是.NET字符,但是EF假设nvarchar字符串类型是nvarchar。在数据库进行比较的查询过程中产生的转换过程需要很长时间。我认为EF教授在这里把我引入歧途了,运行的查询的更准确的表示如下:
SELECT [Extent1].[ID], [Extent1].[SomeStringProp], [Extent1].[SomeOtherProp],
...
FROM [MyTable] as [Extent1]
WHERE [Extent1].[SomeStringProp] = N'1234567890'因此,最终的修复方法是注释代码优先模型,指示正确的SQL数据类型:
public class MyTable
{
...
[Column(TypeName="varchar")]
public string SomeStringProp { get; set; }
...
}发布于 2014-11-14 21:14:33
减慢EF查询的原因是将不可为空的标量与可为空的标量进行比较:
long? userId = 10; // nullable scalar
db.Table<Document>().Where(x => x.User.Id == userId).ToList() // or userId.Value
^^^^^^^^^ ^^^^^^
Type: long Type: long?该查询耗时35秒。而是像下面这样的小重构:
long? userId = 10;
long userIdValue = userId.Value;
db.Table<Document>().Where(x => x.User.Id == userIdValue).ToList()
^^^^^^^^^ ^^^^^^^^^^^
Type: long Type: long给出了令人难以置信的结果:它只用了50ms就完成了。它看起来像EF中的一个bug。
发布于 2013-07-10 18:38:20
如果您正在使用fluent映射,您可以使用IsUnicode(false)作为配置的一部分,以获得相同的效果-
http://msdn.microsoft.com/en-us/data/jj591617.aspx#1.9
http://msdn.microsoft.com/en-us/library/gg696416%28v=vs.103%29.aspx
https://stackoverflow.com/questions/15767803
复制相似问题