【问题标题】:Sorting on database server or application server in n-tier architecture [closed]在 n 层架构中的数据库服务器或应用程序服务器上排序 [关闭]
【发布时间】:2011-05-03 14:22:17
【问题描述】:

假设我正在开发一个具有单个数据库服务器和多个应用程序服务器的应用程序,其中添加应用程序服务器既便宜又容易,但很难扩展数据库。假设我想从数据库中检索一些需要排序的信息。在其他条件相同的情况下,我似乎更喜欢在应用程序服务器上进行排序,因为这会将负载从难以扩展的数据库中转移出去。

现在肯定有一些情况下,在数据库服务器上进行排序是不费吹灰之力的:

  • 为了获得正确的结果集,必须进行排序。例如,如果我想要根据某个标准排在前 N 位,我显然必须在知道我想要哪些行之前进行排序。在应用程序服务器上排序不是一个选项(除非我愿意吸收整个表,这通常不是我想要做的)。
  • 有一个索引支持我的排序顺序。在这种情况下,数据库服务器上的排序基本上是免费的。

但除此之外,我通常更喜欢在应用程序服务器上进行排序是否正确?除了上面列出的情况之外,我还应该考虑一些情况吗?

【问题讨论】:

    标签: database n-tier-architecture


    【解决方案1】:

    我的直觉是对数据库服务器上的数据进行排序,因为这是它的主要功能之一,而且它可能非常有效。然而,危险在于数据可能会在客户端级别被重新使用,从而浪费流程。

    如果您的数据库服务器压力过大,无法再快速对数据进行排序,那么您的问题就更大了。

    如果在服务器上运行的大多数查询都已经过优化,如果架构合理,并且索引到位,那么数据库服务器可以完成大量工作,甚至不费吹灰之力。

    【讨论】:

    • 数据库没有任何开发人员无法使用的排序算法,因此在没有索引的情况下排序数据效率不高(@Aaron特别指向)。
    • 排序不仅仅是算法,但我理解你的意思。我更多地考虑客户端而不是应用程序服务器端。
    【解决方案2】:

    我将用我自己使用 PostgreSQL DBMS 的经验来补充 Jaimal 的评论。如果你有一个大的共享缓冲池,并且你可以准备你关心排序性能的语句,你可以从你的 DBMS 中“免费”获得一个高性能缓存。如果无法准备查询,但可以限制结果集中所需的属性,则可以使用排序谓词对这些属性进行索引。如果您无法在后端执行任何这些优化,那么在应用程序服务器中进行排序将可以正常工作。

    关于应用程序和 DBMS 中排序之间的性能差异,我希望应用程序语言根据其对象模型有一些开销。例如,我希望对 1000000 个 Ruby 对象与 1000000 个 PostgreSQL 元组进行排序会显示数据库更快。

    【讨论】:

    • 听起来你的意思是,如果我的数据库服务器还有一些空闲的 CPU,我可能会通过在那里而不是在应用程序服务器上排序来获得更好的整体性能。我试图了解数据库服务器已经在其 CPU 容量附近运行的情况,但您所说的很有道理,绝对值得牢记。
    【解决方案3】:

    我相信你是对的。在没有索引的情况下,数据库与应用服务器上的排序相比没有性能优势。事实上,在您的应用服务器上,您可以控制使用哪种排序算法,因此原则上您可以使用基数排序(O(n) 时间)之类的方法,而不是快速排序(如果适用于您的情况)。

    【讨论】:

      【解决方案4】:

      如果您的数据不经常更改(您愿意缓存数据)并且可能的结果集数量有限,那么您可以对数据库进行排序,但缓存结果集或缓存一个数组结果集保存的键必须始终执行相同类型的相同数据。

      【讨论】:

      • 这是一个有趣的点——我没有考虑缓存——但即便如此,我不能在应用服务器上排序,然后将结果保存在缓存中吗?至少对于像 memcached 这样的技术,数据在被缓存之前必须通过应用服务器。
      • 当然,这取决于(tm)您计划如何使用数据以及数据更改的频率。
      猜你喜欢
      • 2017-09-13
      • 2015-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-05
      • 1970-01-01
      相关资源
      最近更新 更多