首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实体框架查询速度慢,但SqlQuery中的相同SQL查询速度快

实体框架查询速度慢,但SqlQuery中的相同SQL查询速度快
EN

Stack Overflow用户
提问于 2013-04-02 23:16:13
回答 6查看 62.7K关注 0票数 106

我看到一些非常奇怪的性能,与使用实体框架代码的非常简单的查询有关-首先使用.NET框架版本4。LINQ2Entities查询看起来像这样:

代码语言:javascript
复制
 context.MyTables.Where(m => m.SomeStringProp == stringVar);

这需要超过3000毫秒的时间来执行。生成的SQL看起来非常简单:

代码语言:javascript
复制
 SELECT [Extent1].[ID], [Extent1].[SomeStringProp], [Extent1].[SomeOtherProp],
 ...
 FROM [MyTable] as [Extent1]
 WHERE [Extent1].[SomeStringProp] = '1234567890'

当通过Management Studio运行时,此查询几乎是即时运行的。当我更改C#代码以使用SqlQuery函数时,它在5-10毫秒内运行:

代码语言:javascript
复制
 context.MyTables.SqlQuery("SELECT [Extent1].[ID] ... WHERE [Extent1].[SomeStringProp] = @param", stringVar);

因此,完全相同的SQL,生成的实体在两种情况下都是更改跟踪的,但两者之间存在巨大的性能差异。怎么回事?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2013-04-03 03:39:05

找到了。事实证明这是SQL数据类型的问题。数据库中的SomeStringProp列是.NET字符,但是EF假设nvarchar字符串类型是nvarchar。在数据库进行比较的查询过程中产生的转换过程需要很长时间。我认为EF教授在这里把我引入歧途了,运行的查询的更准确的表示如下:

代码语言:javascript
复制
 SELECT [Extent1].[ID], [Extent1].[SomeStringProp], [Extent1].[SomeOtherProp],
 ...
 FROM [MyTable] as [Extent1]
 WHERE [Extent1].[SomeStringProp] = N'1234567890'

因此,最终的修复方法是注释代码优先模型,指示正确的SQL数据类型:

代码语言:javascript
复制
public class MyTable
{
    ...

    [Column(TypeName="varchar")]
    public string SomeStringProp { get; set; }

    ...
}
票数 113
EN

Stack Overflow用户

发布于 2014-11-14 21:14:33

减慢EF查询的原因是将不可为空的标量与可为空的标量进行比较:

代码语言:javascript
复制
long? userId = 10; // nullable scalar

db.Table<Document>().Where(x => x.User.Id == userId).ToList() // or userId.Value
                                ^^^^^^^^^    ^^^^^^
                                Type: long   Type: long?

该查询耗时35秒。而是像下面这样的小重构:

代码语言:javascript
复制
long? userId = 10;
long userIdValue = userId.Value;

db.Table<Document>().Where(x => x.User.Id == userIdValue).ToList()
                                ^^^^^^^^^    ^^^^^^^^^^^
                                Type: long   Type: long

给出了令人难以置信的结果:它只用了50ms就完成了。它看起来像EF中的一个bug。

票数 52
EN

Stack Overflow用户

发布于 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

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15767803

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档