2010-05-17 18 views
9

我們假設我有一個帶有VARCHAR類型的字段的表。我需要從該字段按字母順序獲取該表中的數據。在數據庫中排序數據的優缺點?

什麼是最佳方式(用於性能):將order by field添加到SQL查詢中或對數據進行排序時,它已被提取?

我使用Java(與Hibernate),但我不能告訴任何關於數據庫引擎。它可以是任何流行的關係數據庫(如MySQL或MS Sql Server或Oracle或HSQL DB或任何其他)。

表中的記錄數量可能差別很大,但我們假設有5k條記錄。

UPD:第二級休眠緩存(例如EHCache)如何支持排序數據?

回答

9

如果此字段已編入索引,那麼平均數據庫在此任務中的效率將高於Java。還要注意,如果是純顯示,通常不會一次檢索所有這些行,而是檢索它的一個子集,以便可以通過分頁顯示它。您也可以在數據庫級別執行此操作。使用Java對數據進行排序需要將整個表格拖入Java內存中,但您不希望這樣做。


在Hibernate中,你可以使用Criteria#addOrder()結果排序並使用Criteria#setFirstResult()Criteria#setMaxResults()分頁。例如。

List users = session.createCriteria(User.class) 
    .addOrder(Order.asc("username")) 
    .setFirstResult(0) // Index of first row to be retrieved. 
    .setMaxResults(10) // Amount of rows to be retrieved. 
    .list(); 
+0

感謝這一點。這不是索引不幸的,但我會記住進一步的情況。 – Roman 2010-05-17 11:52:43

+1

即便如此,在一個體面的數據庫中這樣做比在Java中這樣做更有效率。這是事實。該數據庫專爲那些數據排​​列和分組目的而設計。受益其權力。 – BalusC 2010-05-17 12:04:12

5

對數據庫中的數據進行排序 - 這是其中的一部分。數據庫引擎可能比您更好地對這些數據進行排序。

0

我的解決方案是爲排序列創建索引,並使用order by clause寫入查詢。

1

什麼是最好的方式(用於性能):將字段添加到SQL查詢或排序數據時,它已被提取?

這是ORDER BY,不能排序。

這是一個折中的問題:客戶端的排序是分佈式的,這意味着對服務器的影響較小。但是,它可能需要更多的客戶端資源。

如果現場沒有被索引,返回排序的整體,記錄集中的服務器將需要做以下事情:

  1. 取整記錄
  2. 排序它
  3. 發送過來的網絡向客戶端

,而排序在客戶端僅需要指出13(它們是至少資源密集型)。

如果服務器需要同時爲數百個客戶端提供服務,並且客戶端需要整個記錄集,那麼很可能在客戶端進行排序會更有效率。

如果該字段已編入索引,則數據庫可以返回已從該索引中排序的數據。但是,這需要額外的表查找來獲取其他字段。另外,如果你不想整個記錄集,但只有一些頂部字段(如ORDER BY LIMITSELECT TOP … ORDER BY),整個recorset將不需要通過網絡獲取和傳輸。在這種情況下,數據庫方面的訂購可能會更有效率。

+0

謝謝,我的壞,會糾正。上次我差不多2年前做過了。 – Roman 2010-05-17 11:51:16

0

對於只有5千條記錄,它並沒有真正有什麼區別,但是我把它分類爲數據庫;即使這個領域沒有索引,但可能至少和之後一樣快。

2

臨排序在數據庫:

  1. 速度。如果按條件在訂單上有索引,則數據庫不應該根本排序,爲了獲得最佳性能,您可以使用聚簇索引。
  2. 易於使用。 SQL查詢中的order by比Java比較器更容易編寫和維護。

臨排序中的應用:

  1. 可定製性。也許你想按照更精細的標準進行排序,那麼Java中的自定義排序將更加靈活。
  2. 重複性。如果您爲不同的數據庫編碼,他們的Collating rules可能會有所不同。也許這是一個問題,你想要一個特定的選擇。在Java中,您可以編寫一個Custom Collator以確保所有數據庫的輸出都以相同的方式排序。
0
  • 您是否通常只提取該數據的一個子集? - >一個好的後端設計(索引和/或分區)可以幫助你提取更快排序的子集;那麼db上的「order by」就是瞬時問題。
  • 表總是包含幾行數據?然後在DB的「排序依據」是瞬間

,即使你沒有(不能)優化數據庫,你應該(幾乎)總是寧願讓那種op.s來的事該會

0

,如果你願意你的所有數據的拉入內存,在內存中使用它,這裏是將工作非常好您的使用情況

http://casperdatasets.googlecode.com

它有效的運作就像一個圖書館內存表,並允許您對內存(和Java)中的數據執行搜索,篩選和SORTING操作。它對於您正在嘗試使用的記錄數量執行速度非常快,而且您不需要與沉重的ORM框架集成。

相關問題