2011-05-03 72 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

相關問題