论EF+LINQ分页和数据库分页效率问题

oLanJieKou 2013-11-08 09:21:45
RT
小弟一直纠结EF+LINQ是不是没有数据库分页的效率高 或者说EF+LINQ分页会占用更多资源
还有对于大数据呢 EF+LINQ是否还能胜任?期待你的解答 thx
...全文
1044 28 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
weijian300 2016-05-05
  • 打赏
  • 举报
回复
效率先不说吧,就sql server而言,40W数据用存储过程分页应该用不到7吧,网上很多存储过程都能达到500W数据查询时间在3以下的,最多就是在select所有字段的时候,如果有html的content这类的内容时,才会超过3,但是我相信绝大部分功能是不会这样select的 另外就是效率,曾经重翻过公司底层,所以对比了ADO,Dapper和EF,感觉效率差不多,但是鉴于之前我们都是用ADO比较多,但是开发效率比较低(跟框架以及代码生成器有关),所以选择了Dapper这一轻量级的ORM
oLanJieKou 2013-11-12
  • 打赏
  • 举报
回复
引用 26 楼 ltcszk 的回复:
[quote=引用 25 楼 oLanJieKou 的回复:] [quote=引用 15 楼 ltcszk 的回复:] IQuaryable只有展开的时候才会去查询数据库,比如tolist、toarray,foreach等等 where一个加一个,和拼接字符串一样是不会查询的
那请问如果我使用.count()会不会只是linq去查询数据呢 否则怎么处理 在自动释放entities上下文 (即使用using) 获取不到集合大小的问题呢[/quote] count()转换成sql就是select count(*),会查数据库,但不会把所有数据返回。 IQuaryable的ToString()方法可以显示生成的sql语句。 或者你直接用Sql Server的工具Sql Server Profiler直接查看EF执行的sql语句 [/quote] 嗯 sqlprofile用过 确实可以看到 但是感觉有点麻烦的说 意思是说用count不会使linq去查询所有数据 只是查了count(*) 那这样的话 应该对性能没影响的哈 谢谢
ltcszk 2013-11-12
  • 打赏
  • 举报
回复
引用 25 楼 oLanJieKou 的回复:
[quote=引用 15 楼 ltcszk 的回复:] IQuaryable只有展开的时候才会去查询数据库,比如tolist、toarray,foreach等等 where一个加一个,和拼接字符串一样是不会查询的
那请问如果我使用.count()会不会只是linq去查询数据呢 否则怎么处理 在自动释放entities上下文 (即使用using) 获取不到集合大小的问题呢[/quote] count()转换成sql就是select count(*),会查数据库,但不会把所有数据返回。 IQuaryable的ToString()方法可以显示生成的sql语句。 或者你直接用Sql Server的工具Sql Server Profiler直接查看EF执行的sql语句
oLanJieKou 2013-11-11
  • 打赏
  • 举报
回复
引用 15 楼 ltcszk 的回复:
IQuaryable只有展开的时候才会去查询数据库,比如tolist、toarray,foreach等等 where一个加一个,和拼接字符串一样是不会查询的
那请问如果我使用.count()会不会只是linq去查询数据呢 否则怎么处理 在自动释放entities上下文 (即使用using) 获取不到集合大小的问题呢
threenewbee 2013-11-08
  • 打赏
  • 举报
回复
之所以有人说LINQ分页效率低,主要是这样几种情况,一个是想当然,完全不懂LINQ,认为LINQ是取出所有的数据,转化为对象,在客户端过滤。一个是使用过第三方编写质量很差的的Provider,或者性能不高的数据库,要么数据库本身效率低下,要么Provider没有使用最佳的查询翻译,这种情况下,的确LINQ存在效率问题。最后就是没有分清楚性能问题讨论的场合。LINQ毕竟比直接访问多包装了一层,还有SQL翻译的开销,所以理论上是要慢一点。但是,这往往在工程实践中问题不大。就好比兜里揣一个手机,你走路理论上因为更大的负重,会更吃力。但是显然没有人因此觉得手机是一个累赘。一些基准测试为了强调这种开销,举了很极端的例子,这种例子如同让一个人抱着100个手机走路——那的确很吃力,但是这种例子其实仅仅是极端的例子,你在生活中不会故意拿100个手机。
oLanJieKou 2013-11-08
  • 打赏
  • 举报
回复
各位 分数不够 就意思意思了 答案都很精彩啊 长姿势了~
oLanJieKou 2013-11-08
  • 打赏
  • 举报
回复
引用 19 楼 caozhy 的回复:
LINQ分页效率和直接用SQL完全等同,如果忽略接口开销的话。我不是说LINQ效率高,是这样的。 如果数据库支持RowNumber,那么LINQ会将Take Skip转化成where RowNumber > .. and < ... 这样的SQL执行,如果数据库不支持,LINQ会查出足够多的数据,然后再得到需要的。这也就是说,效率高不高和你用什么数据库(当然LINQ Provider也要支持)有关。
谢谢 受教
oLanJieKou 2013-11-08
  • 打赏
  • 举报
回复
谢谢各位的回答 小弟的问题才得以完美解决 瞬间感受到了CSDN的强大 各位同行的热情 哈哈
threenewbee 2013-11-08
  • 打赏
  • 举报
回复
LINQ分页效率和直接用SQL完全等同,如果忽略接口开销的话。我不是说LINQ效率高,是这样的。 如果数据库支持RowNumber,那么LINQ会将Take Skip转化成where RowNumber > .. and < ... 这样的SQL执行,如果数据库不支持,LINQ会查出足够多的数据,然后再得到需要的。这也就是说,效率高不高和你用什么数据库(当然LINQ Provider也要支持)有关。
oLanJieKou 2013-11-08
  • 打赏
  • 举报
回复
引用 16 楼 dongxinxi 的回复:
[quote=引用 7 楼 oLanJieKou 的回复:] [quote=引用 6 楼 imfor 的回复:] 都答非所问! EF分页也没什么问题,唯一的就是查询了所有字段,比如你有个content字段内容有1w字,这时候就有性能问题了。 所以查询的时候要select new 你查询的几个字段。但这样写法又不太简洁了。
只存在查询所有字段的性能问题吗 没有其他的问题吗 例如数据库分页需要10条就查询10条 但是 EF会自动查询所有字段+所有数据 然后返回 是不是可以在linq语句中加top来过滤呢[/quote] 不会取全部的,仅当用控件自带的分页才会那样 用Skip+Take。生成的SQL语句效率还是很高的,跟自己写的比较起来,稍微臃肿一点儿罢了 [/quote] 谢谢 如果说我在数据层 返回LIST 就查询所有了 如果返回IQUERYABLE的话 应该是没有去查询是吧 因为我想到逻辑层去分页
oLanJieKou 2013-11-08
  • 打赏
  • 举报
回复
引用 15 楼 ltcszk 的回复:
IQuaryable只有展开的时候才会去查询数据库,比如tolist、toarray,foreach等等 where一个加一个,和拼接字符串一样是不会查询的
多谢 受教 每次我被同事问到这个问题 我就不知道怎么解释了 但是我始终想的是 难不成你想到的微软没想到?。。。想到这里 我自己都笑了 我一直推荐同事使用新技术 可她们总是疑神疑鬼 说这不好那不好的 竟然还死板的去使用ADO.NET去写数据库访问 说什么底层技术 自己控制
  • 打赏
  • 举报
回复
引用 7 楼 oLanJieKou 的回复:
[quote=引用 6 楼 imfor 的回复:] 都答非所问! EF分页也没什么问题,唯一的就是查询了所有字段,比如你有个content字段内容有1w字,这时候就有性能问题了。 所以查询的时候要select new 你查询的几个字段。但这样写法又不太简洁了。
只存在查询所有字段的性能问题吗 没有其他的问题吗 例如数据库分页需要10条就查询10条 但是 EF会自动查询所有字段+所有数据 然后返回 是不是可以在linq语句中加top来过滤呢[/quote] 不会取全部的,仅当用控件自带的分页才会那样 用Skip+Take。生成的SQL语句效率还是很高的,跟自己写的比较起来,稍微臃肿一点儿罢了
ltcszk 2013-11-08
  • 打赏
  • 举报
回复
IQuaryable只有展开的时候才会去查询数据库,比如tolist、toarray,foreach等等 where一个加一个,和拼接字符串一样是不会查询的
oLanJieKou 2013-11-08
  • 打赏
  • 举报
回复
引用 13 楼 q107770540 的回复:
你需要了解一下LINQ的延迟查询特性先 var q = from r in XXentities.XXX select r; 此时q里是没有数据的。 只有执行到 q.skip().take()时,才会去数据库取一页数据并返回
原来如此 那这样的话 linq分页确实不会比数据库分页效率低 我还有一个问题请教下: 我曾经用linq做分页的时候 才40W条数据 为什么就要等待7S左右的时间 才能得到结果呢 是不是如果用数据库分页 时间和我的也是差不多的呢
q107770540 2013-11-08
  • 打赏
  • 举报
回复
你需要了解一下LINQ的延迟查询特性先 var q = from r in XXentities.XXX select r; 此时q里是没有数据的。 只有执行到 q.skip().take()时,才会去数据库取一页数据并返回
oLanJieKou 2013-11-08
  • 打赏
  • 举报
回复
引用 10 楼 q107770540 的回复:
使用skip()结合take()方法在LINQ里实现数据分页,效率上不比数据库分页差
谢谢你的回答 但是我一直有个疑问 就是linq语句到底在什么时候才开始返回数据 例如: var q = from r in XXentities.XXX select r; 这时候再分页; q.skip().take(); 请问数据在我q变量是否已存在呢。还是在skip和take之后才有的
oLanJieKou 2013-11-08
  • 打赏
  • 举报
回复
引用 8 楼 imfor 的回复:
不需要,skip(pageindex).take(10)这样分页就可以。不是所有数据.
你的意思是说 from r in db.XXX select r; 这种语句还没有将数据查询出来是吗
q107770540 2013-11-08
  • 打赏
  • 举报
回复
使用skip()结合take()方法在LINQ里实现数据分页,效率上不比数据库分页差
imfor 2013-11-08
  • 打赏
  • 举报
回复
不需要,skip(pageindex).take(10)这样分页就可以。不是所有数据.
oLanJieKou 2013-11-08
  • 打赏
  • 举报
回复
引用 6 楼 imfor 的回复:
都答非所问! EF分页也没什么问题,唯一的就是查询了所有字段,比如你有个content字段内容有1w字,这时候就有性能问题了。 所以查询的时候要select new 你查询的几个字段。但这样写法又不太简洁了。
只存在查询所有字段的性能问题吗 没有其他的问题吗 例如数据库分页需要10条就查询10条 但是 EF会自动查询所有字段+所有数据 然后返回 是不是可以在linq语句中加top来过滤呢
加载更多回复(7)

62,243

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧