天天看點

SAP HANA: 列式記憶體資料庫評測

我一直懷疑SAP宣稱的主存資料庫HANA能夠實作OLTP。因為記憶體是會“揮發”的,一旦斷電,便什麼都沒了。這也許對OLAP來說沒什麼,畢竟資料可以重新從源系統中抽取,而且OLAP的業務緊迫性似乎也從來沒有來得比OLTP重要。是以我也一直相信記憶體計算隻會充單BI 加速器的功能,是以也就對之“意興闌珊”了——一個做報表的的系統又能挑起什麼樣的驚濤駭浪呢?

有段時間我把更多的注意力放在C-STORE上,一種基于網格(多節點,異地部署)的列式資料庫方案。在處理擴充性和可用性方面,它通過Projection Overlapping(射影重疊備援)技術實作K-Saftey(即能容忍K個節點同時挂掉);在處理更新操作方面(列式資料庫的難點便是更新),它通過一個巧妙的混合架構合并了一個寫優化庫(WS)和一個讀優化庫(RS)。WS通常保持很小的資料量,以便獲得更高的更新性能;RS則是專門為查詢優化過的資料結構。需要值得注意的是WS 也是列式的,而非行式,這樣做的主要目的為了避免寫兩個不同的查詢優化器,同時更加友善的将WS自動的轉換城RS(Tuple Mover)。C-STORE是一種應付大資料很好的方案,很明顯該方案似乎更适合主存架構,是以後來發展成H-STORE(商用VoltDB)也就順理成章。所有的這些讓我更加堅定主存資料庫隻有架構在網格上(或者說“雲”)才能更好的實作其商業應用價值。

而HANA從一開始讓我更相信它會秉承SAP的傳統,以INSTALL-BASE的模式傳遞,然後靠License獲得收入。這種on-premises模式相較于on-demand模式讓我覺得它老氣橫秋。就像那種令人讨厭又根深蒂固的老傳統那樣值得被唾棄。這種主觀的偏見也一直蒙蔽了我,讓我沒有真正花時間去了解它。這次借和SAP合作教育訓練的機會,我深入的了解這個代表SAP未來,也許是整個企業應用行業未來的主存資料庫技術——HANA。

我這裡不想累述HANA的具體架構,這些資訊大家都可以從SAP釋出的官方文檔上去了解。SAP也在最近正式釋出了 HANA的學術報告。了解後會發現跟我上面所述的C-STORE有許多異曲同工之處。我在這裡想給大家一個參照,以幫助大家了解主存資料庫到底有多快,以及我們以後該如何抉擇?

既然要參照,不能隻參考SAP給的資料或者SAP BW等應用跑出的結果。HANA被公布成一種嶄新的資料庫,那麼就讓我們用資料庫的公開基準測試标準TPC-H來測試它,并将結果與傳統的行式資料庫(ORACLE)進行對比。我這次用到的是TPC-H 2.8的資料結構和22個SQL查詢。性能測試主要包含以下4個内容1)資料加載,作為暫時主打資料集市的資料庫,資料加載能力是我們關注的重要名額;2)資料壓縮,一則經常作為列式資料庫的賣點,二則HANA是按記憶體大小來收費的,可是直接關乎成本的;3)查詢性能,記憶體資料庫的主要賣點,是這次基準測試的重頭戲;4)增量更新,是資料倉庫非常重要的名額,也能從側面讓我們看到HANA的OLTP能力,否則就隻能成為Larry所說的“wacko”,而不夠“transformative”了。

TPC-H是一個業界公認的資料庫性能測試基準,比較公正和中立,它定義了8個标準資料庫表:customer, lineitem, nation, orders, partsupp, part, region, supplier,各表之間的關系可見tpc.org官方文檔。從tpch.org官網上下載下傳源代碼,編譯後得到一個資料生成工具(dbgen)和一個查詢生成工具(qgen)。TPC-H定義了不同的資料庫容量(size),用指令dbgen –s 10就可以生成10GB的資料,其中最大的表Lineitem行數達到59986052行。Qgen可以随機産生相同條件的不同取值的22個SQL查詢。

本次測試HANA的運作環境如下:

硬體HP DL980,  記憶體512G,  CPU Xeon X7560 2.27GHZ 32核

作業系統SUSE Linux Enterprise Server 11.1

HANA版本1.00.25.358341

1) 資料加載

用dbgen –s 10指令生成外部的*.tpl檔案(CSV格式), 其中lineitem.tpl檔案大小為7.3GB。手工建立對應的*.ctl檔案,該檔案為HANA所特有的導入參數檔案,具體格式如下:

INTO TABLE VINCEN.LINEITEM

From lineitem.tbl FIELDS DELIMITED BY ‘|’

ERRO LOG LINEITEM.tbl.txt 

将lineitem.tpl和lineitem.ctl檔案上傳到HANA伺服器上(/media/tpc-h/),然後在SAP HANA Studio裡面打開一個SQL Editor視窗,輸入如下指令:

IMPORT FROM '/media/tpc-h/lineitem.ctl' WITH THREADS 10 BATCH 50000

WITH TABLE LOCK WITHOUT TYPE CHECK;

update VINCENT.LINEITEM MERGE DELTA INDEX;

WITH THREADS 10 BATCH 50000是指以10個線程并行導入,每50000條送出一次。這個是SAP所推薦的基于列式資料庫導入的一個組合,我也嘗試過其他組合,得到得結果也差不多。需要注意的是HANA最多容許256個并行線程。WITH TABLE LOCK 和WITHOUT TYPE CHECK同樣可以起到加快資料加載速度的效果。最後還需要有個MERGE DELTA INDEX的動作,就像C-STORE一樣,為了提高更新速度,HANA是先對一個DELTA index進行更新,然後再将之MERGE到主index上。

以同樣的方式對其他表進行資料加載操作。

下表是針對lineitem進行加載的時間對比,機關為秒(s)。

HANA ORACLE
616 680

 HANA的時間是import和merge的時間之和。可見在資料加載方面,HANA的性能是不亞于正常ORACLE的。HANA不僅僅是将資料加載到記憶體中,它還需同時在HDD(硬碟)和SSD(高速閃存)上對資料進行快照存儲和日志記錄。這方面HANA在保證了資料完整性的同時,也實作了列式資料庫更新方面的超越是非常值得肯定的。

在資料加載後設定每個表的主碼和建立相關列的索引,用到語句如下:

ALTER TABLE VINCENT.LINEITEM ADD PRIMARY KEY (L_ORDERKEY,L_LINENUMBER);

CREATE INDEX  ORDERKEY1 ON VINCENT.LINEITEM (L_ORDERKEY);

CREATE INDEX  PARTSUPPKEY1 ON  VINCENT.LINEITEM (L_PARTKEY,L_SUPPKEY);

針對表lineitem 59986052條資料集,上述3個語句執行的總時間在300秒左右。

2) 資料壓縮

在SAP HANA Studio中選中lineitem表,然後右鍵->Open Definition->Runtime Information可檢視到lineitem的大小。我們将原來CSV格式的外部檔案大小除以資料庫表的大小的結果作為壓縮率,即:壓縮率 = CSV檔案大小(7.3G)/ 資料表大小。資料表大小又分為不加索引、純資料的大小以及包含索引的大小。具體結果如下:

項目 HANA ORACLE
不加索引大小 1.67G 5.14G
不加索引壓縮率 4.37 1.42
加索引大小 3.17G 9.84G
加索引後的壓縮率 2.3 0.74

由上表可見HANA具有非常出色的資料壓縮能力,在不加索引的情況下能将外部的CSV格式的檔案壓縮4.37倍。可見列式資料庫在資料壓縮方面的優越性。需要說明的是這次ORACLE的版本是11g R2, 也用到了其最新的行式壓縮技術,但跟HANA比起來明顯不是一個層次的。

3) 查詢性能

用qgen産生22個SQL查詢語句并對其做了簡單的文法調整,例如調整ADD_MONTHS等時間處理函數,盡量不改變語句原來的結構。将這22個查詢複制到SAP HANA Studio的SQL Editor中運作即可獲得每個查詢語句執行的時間。

測試結果以及和ORACLE對比如下(機關:毫秒ms)

查詢 HANA ORACLE 提高倍數
1 4727 66240 14.01
2 1320 3830 2.9
3 1349 28440 21.08
4 1203 22180 18.44
5 1623 30760 18.95
6 738 16500 22.36
7 1104 25100 22.74
8 1041 20830 20.01
9 12896 60020 4.65
10 2213 26060 11.78
11 805 3700 4.6
12 987 22860 23.16
13 2963 70980 23.96
14 1950 19080 9.78
15 1437 17280 12.03
16 927 6060 6.54
17 860 15400 17.91
18 3177 58000 18.26
19 695 18930 27.24
20 728 20670 28.39
21 16702 47880 2.87
22 1294 6310 4.88
總時間 60739 607110 10

提高倍速 = ORACLE的執行時間 / HANA的執行時間

可以看到HANA每個查詢都比傳統的行式資料庫快很多,22個查詢總體時間也正好是ORACLE的十分之一。對于有些查詢,速度提升非常明顯,例如第19和20個查詢。深入調查發現這2個查詢都涉及到對最大表lineitem的查詢和聚合計算。可見HANA對越大的表查詢提升的性能越明顯。例外情況是第21個查詢,雖然也涉及到了對lineitem的查詢,但該語句包含了3次lineitem的自連接配接(self-join),進一步深入發現凡是對lineitem有join操作的 SQL查詢HANA的性能都表現得相對不盡如人意。可見HANA對join處理還需要進一步提高,SYBASE IQ在這方面有許多值得HANA去借鑒的地方。

4) 增量更新

這次增量更新也是更加偏向于性能,而不是我們通常要求的ACID原則。先通過以下語句删除表lineitem中的6000000行記錄:

DELETE FROM VINCENT.LINEITEM WHERE L_ORDERKEY BETWEEN 1 AND 6000000;

删除6000000記錄耗時29秒。

用dbgen –s 1重新産生第1到6000000行記錄的CSV檔案,上傳到HANA伺服器上(/media/tpc-h1/),用以下導入指令完成對資料的加載:

IMPORT FROM '/media/tpc-h1/lineitem.ctl' WITH THREADS 10 BATCH 50000;

update VINCENT.LINEITEM MERGE DELTA INDEX;

跟初始導入所不同的是,這次導入是不會鎖表的,并且有主碼重複的檢查和索引的同步更新消耗。導入時間40秒,融合時間為124秒。可以看出增量更新的速度(36000行每秒)不如初始導入時候的速度(97000行每秒),不過這個速度也是相當不錯的。融合(MERGE)過程耗去了大部分的時間。

總結:

這次拿ORACLE和HANA做對比,沒有任何貶低ORACLE的意思。ORACLE是傳統RDBMS的翹楚,它代表了在這個領域最好的技術;而HANA是主存資料庫的代表,是SAP孤注一擲的籌碼。這樣的對比能讓我們更加清楚的看清未來資料庫的發展趨勢。也許熟悉ORACLE的人會說最新的版本11g支援并行查詢,或許能獲得和HANA相差不多的查詢性能。但我們更應該看到主存資料庫強大的潛力。SAP不大可能一蹴而就,但它似乎正在按照自己的步驟一步一步向前。在一次針對銷售的教育訓練上,我向一位德國的顧問提問“為什麼不把HANA架構在雲上?”,他半開玩笑的說:“啊!SAP應該馬上把你招進來。實際上我們正在朝這個方向發展,但現在這種情況隻是個開始。”

實際上我已經看到了BW on HANA,這也确實向大家證明:至少現在Netweaver平台是可以完全運作在HANA上的。我也知道 HP的硬體目前可支援16個節點8 TB容量的記憶體。是以我也有理由相信Hasso真能帶領着他的200人近衛軍改變目前沉悶的氛圍和乏味的遊戲規則。Business Suite on HANA 将是R4, Business ByDesign on HANA将是R5,  HANA on Cloud就是R6, …… 希望SAP的Realtime能一直堅持下去,能給我們足夠的驚喜!