2011-05-03 69 views
0

假设我正在开发具有单个数据库服务器和多个应用程序服务器的应用程序,该应用程序便宜且易于添加应用程序服务器,但难以扩展数据库。假设我想从数据库中检索一些需要排序的信息。除此之外,我认为应该更喜欢在应用程序服务器上进行排序,因为这会将负载从数据库转移出去,这很难扩展。在n层体系结构中对数据库服务器或应用程序服务器进行排序

现在当然也有一些案件中,排序在数据库服务器上是一个没有脑子:

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

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

回答

2

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

如果您的数据库服务器过于紧张,无法再快速排序数据,则会出现更大的问题。

如果在服务器上运行的大多数查询都已经过优化,如果模式是合理的,并且索引就位,那么数据库服务器可以完成大量工作,甚至不用冒汗。

+0

数据库没有任何开发人员无法使用的排序算法,所以在没有索引的情况下排序数据(这是@Aaron特别指出的情况)并不是更高效。 – Elad 2011-05-03 14:31:15

+0

排序比算法还要多,但我理解你的观点。我在考虑更多的是客户端而不是应用服务器端。 – datagod 2012-01-31 02:37:48

0

我相信你是对的。在没有索引的情况下,数据库相对于应用程序服务器上的排序没有性能优势。事实上,在你的应用服务器上,你可以控制你使用的排序算法,所以原则上你可以使用基数排序(O(n)time)而不是快速排序(如果适用于你的情况)。

0

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

+0

这是一个有趣的观点 - 我没有想过缓存 - 但即便如此,我无法在应用程序服务器上排序,然后将结果保存在缓存中?至少像memcached这样的技术,数据必须在缓存之前通过应用服务器。 – Aaron 2011-05-13 13:37:15

+0

当然,它取决于(tm)您计划如何使用数据以及数据更改的频率。 – 2011-05-13 16:36:00

2

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

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

+0

听起来像你所说的是,如果我的数据库服务器仍有一些CPU空闲,我可能会通过排序而不是在应用程序服务器上获得更好的整体性能。我试图弄清楚数据库服务器已经运行在CPU容量附近的情况,但是你所说的话是有道理的,绝对值得记住。 – Aaron 2011-05-13 13:42:58

相关问题