AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 1245
Accepted
Marek Grzenkowicz
Marek Grzenkowicz
Asked: 2011-02-16 13:02:06 +0800 CST2011-02-16 13:02:06 +0800 CST 2011-02-16 13:02:06 +0800 CST

ADO.NET 实体框架是否以生成性能不佳的查询而闻名?

  • 772

这个问题的灵感来自于发布到最新 ServerFault 博客文章的评论:

你们还在使用 LINQ to SQL 吗?

我知道我可以使用 SQL Server Profiler 和/或方法来查看生成的ToTraceString查询并自己分析它们。但是,我正在寻找具有管理使用 Entity Framework 的应用程序访问的数据库的实践经验的人的意见。

实体框架查询是性能问题的常见原因吗?
在这种情况下可以优化 LINQ 查询还是原始 Transact-SQL 是唯一的解决方案?

sql-server performance
  • 3 3 个回答
  • 1540 Views

3 个回答

  • Voted
  1. Eric Humphrey - lotsahelp
    2011-02-16T13:59:49+08:002011-02-16T13:59:49+08:00

    这取决于查询是什么。ORM 通常非常擅长 CRUD,因为它们通常很简单。查询越复杂,错误查询的可能性就越大。您可以通过调整 LINQ 语句来调整生成的查询。不过,您迟早会厌倦打架,并为任何复杂的事情使用 SQL 查询或存储过程。

    • 10
  2. Best Answer
    Andrew Bickerton
    2011-02-17T03:59:22+08:002011-02-17T03:59:22+08:00

    个别查询没问题

    ORM 工具(Entity Framework、Linq、 LLBLGen、NHibernate等)的最大性能“问题”之一并不是执行的单个查询的性能(大多数只是检索单个查询的 CRUD 调用)根据主键记录回)。

    不正确使用延迟加载 = 性能不佳

    这是延迟加载的不正确使用,如果您没有正确设置预取属性,您最终可能会对数据库执行大量执行(可以在一次调用数据库中检索到的东西,变成 200 个人执行,所有网络和 IO 开销都与它们相关联)

    从LINQ 到 SQL,延迟加载和预取

    事实证明,对 ProjectEntity 和 CustomerEntity 对象的每次访问都会在第一次引用特定项目或实体时导致对服务器的单独查询(如图所示)。这意味着对于应用程序中的每个项目,将有两个额外的查询访问服务器,因此如果我显示 20 个项目,我将额外访问数据库 40 次。这对您来说是延迟加载,并且通常在这样的基于列表的显示中是一个问题。如果您显示的每一行都需要一个或多个相关实体,情况可能会更糟。

    关键是知道你正在访问什么

    使用 ORM 和自己动手操作之间 的真正区别在于,当您自己编写代码时,您不得不考虑 SQL 应该如何构建,并且您可以轻松地进入并针对您要解决的特定场景进行调整。

    而在使用 ORM 时,您会受到 ORM 工具提供的选项和自定义的限制,并且许多开发人员只是将其留给 ORM 工具本身(假设/希望它会提出最佳计划),这就是 ORM 的原因工具被广泛认为有利于 CRUD,但不适用于更复杂的操作......

    注意:延迟加载可能是一件非常好的事情,当它被不当使用时,这就是问题......

    • 4
  3. garik
    2011-02-17T01:53:44+08:002011-02-17T01:53:44+08:00

    Linq to SQL 和 Linq to Entities(实体框架)是一些不同的实现。第一个比第二个更老、更轻量级的 ORM。由于性能,有人喜欢使用第一个。这里有一些链接可以找出这些技术之间的差异:

    实体框架与 LINQ to SQL LINQ to SQL 与 ADO.NET 实体框架

    这篇文章解释了为什么 EF 这么慢以及如何提高性能(如果可能的话:)):

    EF 查询调优

    主要问题:第一次调用数据库(实体创建,映射......)太慢了。因此,对于关键查询(应用程序),我仍然更喜欢旧的良好存储过程。作为一种变体,可以将 EF(我认为)与预加载的应用程序缓存一起使用。

    • 1

相关问题

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

  • 我在哪里可以找到mysql慢日志?

  • 如何优化大型数据库的 mysqldump?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    您如何显示在 Oracle 数据库上执行的 SQL?

    • 2 个回答
  • Marko Smith

    如何选择每组的第一行?

    • 6 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    我可以查看在 SQL Server 数据库上运行的历史查询吗?

    • 6 个回答
  • Marko Smith

    如何在 PostgreSQL 中使用 currval() 来获取最后插入的 id?

    • 10 个回答
  • Marko Smith

    如何在 Mac OS X 上运行 psql?

    • 11 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Marko Smith

    将数组参数传递给存储过程

    • 12 个回答
  • Martin Hope
    Manuel Leduc PostgreSQL 多列唯一约束和 NULL 值 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler 什么时候应该将主键声明为非聚集的? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    BrunoLM Guid vs INT - 哪个更好作为主键? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k 什么时候应该使用唯一约束而不是唯一索引? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick 如何优化大型数据库的 mysqldump? 2011-01-04 13:13:48 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve