哪个更快?数据检索

4

在IT技术中,是更快地从数据库中一次性获取3000多行数据并在.NET和LINQ中进行操作,还是更快地进行6次调用,每次只获取几百行数据?


这并不是直接回答你的问题,但我曾经问过一个关于链接“Linq有多快”的问题(https://dev59.com/sEXRa4cB1Zd3GeqPqEHO)。也许那些答案能帮到你。 - ThatBloke
12个回答

6

这将完全取决于数据库速度、网络带宽和延迟、.NET机器速度、实际查询等因素。

换句话说,我们无法给出真实的一般性答案。我知道这听起来更容易编码 :)

不幸的是,这种事情你很难在没有生产环境的确切副本的情况下有用地测试 - 大多数测试环境与生产环境有所不同,这可能会严重改变结果。


1
这是为一个用户还是多个用户查询数据?在负载下,单个数据库调用将更好地扩展。

1

速度只是众多考虑因素之一。

你的代码有多灵活?当需求变化时,修改和扩展有多容易?另一个人阅读和维护你的代码有多容易?你的代码有多可移植?如果你更改到不同的DBMS或不同的编程语言会怎样?这些考虑因素在你的情况下是否重要?

话虽如此,如果其他所有事情都相等或不重要,那就选择单次往返。

你提到单次往返可能会导致读取不需要的数据。如果你需要的所有数据可以在单个结果表中描述,那么应该可以设计一个查询来获取该结果。如果查询非规范化数据,则该结果表可能会以多行形式提供某些结果数据。在这种情况下,通过获取多个结果表并自己组合结果,您可能会获得一些速度优势。

你没有给出足够的信息来知道编写单个查询或编写返回的6个查询数据需要多少编程工作。

正如其他人所说,这取决于情况。


1
我在这里遇到的问题是,我需要全部信息,只不过需要将它们分开显示...
回答你的问题是,如果你不管怎么样都需要带回所有3000行,那么一次查询3000行比分6次查询500行更好。
然而,你不可能(想)一次性显示出3000行,不管使用Linq与否,你都需要运行聚合查询并让数据库为你完成工作。你应该能够构建SQL(或Linq查询)以一次性执行所有所需逻辑。
没有知道你在做什么,很难更具体地说明。
* 如果你确实、绝对需要带回所有行,请调查ToLookup()方法,用于你的linq IQueryable。它非常方便,可以按非标准方式分组结果。

哦,我强烈推荐使用LINQPad(免费)来尝试使用Linq查询。它有很多示例,并且还显示了SQL和Lambda表单,以便您熟悉Linq<->lambda form<->Sql。


1

如果您预先知道要执行哪6个 SQL 语句,您可以将它们捆绑到一个对数据库的调用中,并使用 ADO 或 ADO.NET 返回多个结果集。

http://support.microsoft.com/kb/311274


0

嗯,答案总是“这要看情况”。你想优化数据库负载还是应用程序负载?

在这种情况下,我的一般建议是尽可能在数据库层面使用具体的查询,因此使用6个调用。


0

谢谢

我有点想法是“大致范围”,但听起来好像是一个选择的事情...差异可能很小。

我认为在 .net 中获取所有数据并进行操作是最好的选择 - 我没有具体的依据(因此提出问题),我只是觉得对数据库的调用是昂贵的,如果我知道我需要所有的数据...就一次性获取它?!?


请通过特定回复下方的评论按钮发表您的评论。如果您的评论是针对多个人的,请编辑您的原始帖子并将消息粘贴在底部。答案部分是用于... 嗯... 答案的。 - Oli

0
问题的一部分在于您没有提供足够的信息,以便给出精确的答案。显然,需要考虑可用资源。
如果您不经常检索3000行数据,则短期内可能适用于您。然而,如果有大约10,000人执行相同的查询(忽略缓存效应),这可能会对应用程序和数据库造成问题。
现在,对于像分页这样的情况,只拉取所需的内容是有意义的。但这将是一个通用规则,尽量只获取必要的内容。使用手术刀而不是大刀,这更加优雅。=)

0

如果你谈论的是已经由SQL运行(因此由SQL Server优化)的查询,则使用LINQ或SqlDataReader可能实际上具有相同的性能。

唯一的区别将是“维护代码有多难?”

LINQ不会查询任何数据库,直到您使用“.ToList()”、“ToArray()”甚至“.Count()”请求结果。 LINQ动态构建您的查询,因此与运行时验证的SqlDataReader完全相同。


0

我一直坚持“只带入所需”的原则,没有多余的...但问题是我需要全部内容,只是需要分开显示。

比如说... 我有一个包含userid和typeid的表格。我想要显示所有带有userid的记录,并在页面上按照typeid分别显示。

目前我调用了一个存储过程,执行“select field1, field2 from tab where userid=1”,然后在页面上将网格的数据源设置为“from t in tab where typeid=2 select t;”

而不是调用6次不同的存储过程“select field1, field2 from tab where userid=1 and typeid=2”。

??


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接