一次访问数据库并带回3000多行,然后在.net&中操作它们是否更快LINQ还是更快地进行6次调用,一次带回几百行?
答案 0 :(得分:6)
完全取决于数据库的速度,网络带宽和延迟,.NET机器的速度,实际查询等。
换句话说,我们不能给你一个真实的一般答案。我知道哪些声音更容易编码:)
不幸的是,如果没有生产环境的完全副本,就无法轻松测试这种情况 - 大多数测试环境与生产环境有些不同,生产环境可能会发生严重变化结果。
答案 1 :(得分:1)
这是针对一个用户,还是会有很多用户查询数据?单个数据库调用将在负载下更好地扩展。
答案 2 :(得分:1)
速度只是众多考虑因素之一。
您的代码有多灵活?当需求发生变化时,修改和扩展有多容易?另一个人阅读和维护代码有多容易?你的代码有多便携?如果您更改为不同的DBMS或不同的编程语言会怎样?在您的情况下,这些考虑是否重要?
话虽如此,如果所有其他事情都相同或不重要,那就去单程往返。
您提到单次往返可能会导致您不需要读取数据。如果您需要的所有数据都可以在单个结果表中描述,那么应该可以设计一个可以获得该结果的查询。如果查询对数据进行非规范化,那么结果表可能会在多行中提供一些结果数据。在这种情况下,您可以通过获取多个结果表中的数据并自己编写结果来获得一些速度。
您没有提供足够的信息来了解编写单个查询或编写6个查询返回的数据所需的编程工作量。
正如其他人所说,这取决于。
答案 3 :(得分:1)
我在这里遇到的问题是我需要一切,我只是需要单独显示...
您的问题的答案是1行查询3000行优于6行查询500行。 (假设你带回所有3000行)
然而,你不可能(想要)一次显示3000行,是吗?很有可能,无论使用Linq,您都希望运行聚合查询并让数据库为您完成工作。您应该能够构建SQL(或Linq查询)以一次执行所有必需的逻辑。
不知道你在做什么,很难更具体。
*如果你绝对需要带回所有行,那么请研究你的linq IQueryable的ToLookup()方法< T>。以非标准方式对结果进行分组非常方便。
哦,我强烈推荐使用LINQPad(免费)来尝试使用Linq进行查询。它有很多示例,它还会显示sql和lambda表单,以便您熟悉Linq< - > lambda表单< - > Sql。
答案 4 :(得分:1)
如果您知道要预先执行哪6个SQL语句,可以将它们捆绑到一个数据库调用中,并使用ADO或ADO.NET返回多个结果集。
答案 5 :(得分:0)
嗯,答案总是“它取决于”。您想优化数据库负载还是应用程序负载?
在这种情况下,我的一般答案是在数据库级别使用尽可能多的特定查询,因此使用6次调用。
答案 6 :(得分:0)
THX
我有点想“球场”,但听起来好像是一个选择......差别可能很小。
我认为获取所有数据并在.net中进行操作将是最好的 - 我没有具体的基础(因此问题),我只是倾向于觉得对DB的调用是昂贵的,如果我知道我需要所有的数据......一次性获取它吗?!?
答案 7 :(得分:0)
部分问题在于您没有提供足够的信息来为您提供准确的答案。显然,需要考虑可用资源。
如果你不经常拉3000行,它可能在短期内适合你。但是,如果有10,000个人执行相同的查询(忽略缓存效果),这可能会成为app和db的问题。
现在在像分页这样的情况下,提供你需要的内容是有意义的。但是,这只是一个普遍的规则,试图只拉动必要的东西。使用手术刀而不是大刀更加优雅。 =)
答案 8 :(得分:0)
如果您正在讨论已由SQL运行的查询(由SQL Server优化),则使用LINQ或SqlDataReader实际上可能具有相同的性能。
唯一的区别是“维护代码有多难?”
在您使用“.ToList()”或“。ToArray()”或甚至“.Count()”请求结果之前,LINQ不会向数据库查询任何内容。 LINQ正在动态构建您的查询,因此它与拥有SqlDataReader但运行时验证完全相同。
答案 9 :(得分:0)
我始终坚持“引进我需要的东西”的规则而已......我在这里遇到的问题是我需要一切,我只是需要单独显示。
所以说...... 我有一个userid和typeid的表。我想用userid显示所有记录,并在网格上显示以typeid分隔的网格。
目前我调用了“从userid = 1的tab中选择field1,field2”的sproc, 然后在页面上将网格的数据源设置为从tab中的t开始,其中typeid = 2 select t;
而不是调用不同的sproc“select field1,field2 from tab where userid = 1 and typeid = 2”6次。
...
答案 10 :(得分:0)
为什么不尝试两种方法并测量结果,而不是推测?
答案 11 :(得分:0)
取决于
1)如果您的连接器实现预先占用大量对象并且您有大行(例如blob,contry多边形等),那么您就会遇到问题,您必须下载大量数据。我已经优化了一次有这个问题的代码,它只是通过localhost一直下载一些垃圾,而我的软件运行速度提高了10倍,因为我通过选项删除了预先缓存
2)如果您的行很小并且您很有可能需要阅读所有3000,那么您最好使用大型结果集
3)如果您不使用预准备语句,则必须解析所有查询!大结果集可能更好。
希望有所帮助