【问题标题】:Which is fastest? Data retrieval哪个最快?数据检索
【发布时间】:2010-09-18 18:09:44
【问题描述】:

访问数据库并带回 3000 多行,然后在 .net 和 LINQ 中操作它们更快,还是更快地进行 6 次调用,一次带回几 100 行?

【问题讨论】:

  • 这并没有直接回答你的问题,但我问了一个关于链接"How fast is Linq"的问题。也许答案会对你有所帮助。

标签: asp.net sql database linq


【解决方案1】:

我这里的问题是我需要它,我只需要它单独显示......

您的问题的答案是 1 次查询 3000 行优于 6 次查询 500 行。 (假设您无论如何都要带回所有 3000 行)

但是,您不可能(想要)一次显示 3000 行,是吗?很可能,不管使用 Linq,您都希望运行聚合查询并让数据库为您完成工作。您应该希望能够构建 SQL(或 Linq 查询)以一次性执行所有必需的逻辑。

不知道自己在做什么,很难更具体。

* 如果您绝对肯定需要恢复所有行,那么请调查您的 linq IQueryable 的 ToLookup() 方法。以非标准方式对结果进行分组非常方便。

哦,我强烈推荐LINQPad(免费)尝试使用 Linq 进行查询。它有大量示例,还向您展示了 sql 和 lambda 形式,以便您熟悉 Linqlambda 形式Sql。

【讨论】:

    【解决方案2】:

    我始终坚持“带来我需要的东西”的规则,仅此而已......我的问题是我需要它,我只需要单独显示。

    所以说... 我有一个带有 userid 和 typeid 的表。我想显示带有用户 ID 的所有记录,并以网格形式显示在页面上,以 typeid 分隔。

    目前我调用 sproc 执行“从 userid=1 的选项卡中选择 field1, field2”, 然后在页面上将网格的数据源设置为 from t in tab where typeid=2 select t;

    而不是调用不同的存储过程“从 userid=1 和 typeid=2 的选项卡中选择 field1, field2”6 次。

    ??

    【讨论】:

      【解决方案3】:

      视情况而定

      1) 如果您的连接器实现预缓存了很多对象并且您有大行(例如 blob、contry 多边形等),那么您遇到了问题,您必须下载大量数据。我已经优化了一个有这个问题的代码,它只是通过 localhost 一直下载一些垃圾,我的软件现在运行速度快了 10 倍,因为我通过一个选项删除了预缓存

      2) 如果您的行很小,并且您很有可能需要通读所有 3000 行,那么您最好使用大结果集

      3) 如果你不使用准备好的语句,所有的查询都必须被解析!大结果集可能会更好。

      希望对你有帮助

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

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

          您的代码有多灵活?当需求发生变化时,修改和扩展有多容易?其他人阅读和维护您的代码有多容易?您的代码的可移植性如何?如果您更改为不同的 DBMS 或不同的编程语言会怎样?这些考虑因素对您来说是否重要?

          话虽如此,如果所有其他事情都相同或不重要,请选择单程往返。

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

          您没有提供足够的信息来了解编写单个查询或编写 6 个查询返回的数据需要多少编程工作。

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

          【讨论】:

            【解决方案6】:

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

            【讨论】:

              【解决方案7】:

              与其推测,不如尝试两者并衡量结果?

              【讨论】:

              • Bryan 这是个好主意 - 我只是时间紧迫,希望有人能提供帮助。
              【解决方案8】:

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

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

              在您使用“.ToList()”或“.ToArray()”甚至“.Count()”请求结果之前,LINQ 不会向数据库查询任何内容。 LINQ 动态构建您的查询,因此它与拥有 SqlDataReader 完全相同,但具有运行时验证。

              【讨论】:

                【解决方案9】:

                部分问题在于您没有提供足够的信息来给您一个准确的答案。显然,需要考虑可用资源。

                如果您不经常提取 3000 行,它可能在短期内对您有用。但是,如果有 10,000 人执行相同的查询(忽略缓存效果),这可能会成为应用程序和数据库的问题。

                现在,在分页之类的情况下,只提取您需要的内容是有意义的。但这将是一个一般规则,试图只拉出必要的东西。使用手术刀而不是大刀要优雅得多。 =)

                【讨论】:

                  【解决方案10】:

                  谢谢

                  我有点想“棒球场”,但这听起来像是一个选择……差异可能很小。

                  我认为获取所有数据并在 .net 中进行操作将是最好的 - 我没有任何具体的依据(因此提出了问题),我只是倾向于觉得调用数据库很昂贵,如果我知道我需要所有数据...一键获取?!?

                  【讨论】:

                  • 请通过特定回复下方的 cmets 按钮制作您的 cmets。如果您的评论是针对多人的,请编辑您的原始帖子并将您的信息贴在底部。答案部分是为了……好吧……答案。
                  【解决方案11】:

                  嗯,答案总是“视情况而定”。您想优化数据库负载还是应用程序负载?

                  在这种情况下,我的一般回答是在数据库级别使用尽可能具体的查询,因此使用 6 次调用。

                  【讨论】:

                    【解决方案12】:

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

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

                    不幸的是,如果没有生产环境的确切副本,您将无法轻松地进行有用的测试 - 大多数测试环境与生产环境有些不同,这可能会严重改变结果。

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2012-07-13
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      相关资源
                      最近更新 更多