分組是數據庫的常見運算,無論數據如何準備,通常都需要將所有數據遍歷。建立索引這時是不起作用的,存儲格式才是決定遍歷效率的主要因素。數據庫中數據的存放雖然是二進制格式的,但普遍IO性能差,庫內遍歷快,外部取數都很慢。
下面用Oracle來舉個例子,數據如下:
ORDERID CLIENT SELLERID AMOUNT ORDERDATE NOTE
1 287 47 5825 2013-05-31 gafcaghafdgie f ci…
2 89 22 8681 2013-05-04 gafcaghafdgie f ci…
3 47 67 7702 2009-11-22 gafcaghafdgie f ci…
4 76 85 8717 2011-12-13 gafcaghafdgie f ci…
5 307 81 8003 2008-06-01 gafcaghafdgie f ci…
6 366 39 6948 2009-09-25 gafcaghafdgie f ci…
7 295 8 1419 2013-11-11 gafcaghafdgie f ci…
8 496 35 6018 2011-02-18 gafcaghafdgie f ci…
9 273 37 9255 2011-05-04 gafcaghafdgie f ci…
10 212 0 2155 2009-03-22 gafcaghafdgie f ci…
…
實際數據量已經超過了數據庫的最大內存(數據總量為 25G,Oracle 可用的最大內存為 12G)。使用Oracle的Parallel Execution來完成分組匯總,SQL大概這樣:
select /*+ Parallel(8) */ client,sellerid,count(orderid),sum(amount) from orders group by client,sellerid
這個SQL執行耗時:210秒。
同樣的環境、同樣的數據,用集算器來處理,耗時約65秒,代碼如下:

后者速度快是因為使用了集算器集文件(二進制文件)作為數據存儲,正如之前提到的數據存儲格式直接影響遍歷的性能,關于存儲格式、特點、性能排名如下表:

存儲格式特點性能排名二進制占用空間最小,解析最快1文本文本的好處是通用,但性能不好2數據庫也是二進制,但普遍IO性能差,庫內遍歷快,外部取數都很慢3
處理大量數據時,性能優化的第一步,往往是挑選合適的存儲格式。數據庫的存儲十分寶貴,為了節約存儲,提高運算性能,可將單純用作OLAP場景的那些數據搬到數據庫外部,使用更高性能的存儲格式存放數據。感興趣可以參考:性能優化教案—遍歷
集算器還很容易嵌入到Java應用程序中,Java如何調用SPL腳本有使用和獲得它的方法。
關于集算器安裝使用、獲得免費授權和相關技術資料,可以參見如何使用集算器。