【问题标题】:What advantages does one big database query have over many small ones一个大的数据库查询比许多小的查询有什么优势
【发布时间】:2010-10-26 14:26:08
【问题描述】:

我继承了应用程序,它的作用是从 4 个视图中获取数据,其中包含 1000 条记录的块(其中包含 xml 文件),然后将它们写到 xml 文件中,所有这些都由具有 9 个不同的类型参数分割可能性。这意味着在最坏的情况下,每 1000 个该类型/视图组合将有 36 个到数据库的连接。

实际数据将存在 90.000 行,在这种情况下,从数据库中提取多达 1000 行需要 900 - 936 次。

现在我想知道将所有数据读入应用程序并让应用程序使用它来写入 900 多个文件会有什么优势。

1000 行大约是 800MB,90.000 行大约是 81GB 正在传输的数据。

如果我们一次阅读所有代码,则必须重写代码,尽管这更有意义,但这是一次性的工作。在 90.000 行之后,我们将不再使用此代码。花 2 到 3 个小时来重写代码以通过这种方式减少连接量是否值得?

【问题讨论】:

  • 如果是一次性工作,似乎不值得重写。当我完成输入这句话时,它实际上可能已经执行完毕。
  • 是否值得花时间重新编写经过测试和工作的一次性代码?如果没有实际问题,我会说您可能会为您的时间找到更好的用途...
  • 多个请求是否发生在单个事务中?数据是通过网络服务还是直接进入盒子?我想说这些对于回答这个问题很重要。
  • PaulG,对于您的问题,交易采用的方法将重复 936 次,使用 using 语句,因此每次都应关闭连接。这是需要花费很多时间才能在某个位置的盒子上运行的东西(在此之前有一些步骤可以提供数据库中的数据。)。

标签: c# .net sql .net-4.0 c#-4.0


【解决方案1】:

如果这是一次性的事情,那为什么还要花精力优化它呢?答:没有。

不过,让我补充一下,以回答您的一般问题,即大查询相对于许多小查询有什么优势:可能没有。如果你运行一个巨大的查询,你会给中间件留下很多魔法,它可能会也可能不会很好地工作。

虽然同时拥有 36 个连接也不是最佳选择,但它可能比运行可能返回 80 GB 数据的查询要好。理想的解决方案(如果您必须多次使用此代码)将重写它以获取数据块,但不要同时打开大量连接。

【讨论】:

  • 实际上一次只有1个连接,但在现场情况下,循环重复936次。如果我得到了正确的答复,那么理想的解决方案就是我现在拥有的解决方案。
  • 是的,我相信是的!以块的形式获取数据是处理大块数据的最佳实践。否则,您将依赖任意数量的其他中间系统(SQL 服务器、.NET、LINQ、数据提供程序等)来管理您和服务器之间来回发送的内容流。在最坏的情况下,应用程序可能会尝试同步加载整个结果。 Asp.net 可能会以某种方式管理此问题,我不确定默认处理方式是什么,但最好让您的应用程序决定一次请求多少数据是合理的。
  • 再观察一下 - 800 MB 仍然是一次加载到内存中的大量数据。内存分配/释放可能会很慢,减少块大小可能会更好。如果应用程序所做的只是读取一行并将其解析为 XML 文件,并且除了每行中的内容之外不需要其他数据来完成其工作,那么考虑到大量数据,即使一次获取一行似乎也是合理的在每一行。
【解决方案2】:

代码是否已经工作?如果是这样,那么我不会花时间重写它。您会遇到在代码中引入错误的风险。由于您将使用它一次并且永远不会再次使用它,因此似乎不值得付出努力。

【讨论】:

    【解决方案3】:

    如果我们谈论的是 SQL Server,大型查询(单个批次)相对于许多小型查询(请注意与您所问的问题相反)的最大缺点是只能是每批一个查询计划。

    【讨论】:

      【解决方案4】:

      如果这是一次性工作,我会拒绝。很多时候我做了一些我通常不会做的事情(光标),但这只是因为它是一次性的工作。

      问问自己,花 2 到 3 个小时在一些已经有效但您永远不会再使用的东西上是有意义的。不过,显然还有其他因素需要考虑。这会让您的生产数据库锁定 2-3 小时吗?

      如果没有灾难性的副作用,我会说使用你所拥有的。

      【讨论】:

        猜你喜欢
        • 2012-04-08
        • 1970-01-01
        • 1970-01-01
        • 2017-05-17
        • 1970-01-01
        • 2012-11-17
        • 2012-09-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多