ClickHouse vs Oracle
先用 ClickHouse(簡稱 CH)、Oracle 數(shù)據(jù)庫(簡稱 ORA)一起在相同的軟硬件環(huán)境下做對比測試。測試基準使用國際廣泛認可的 TPC-H,針對 8 張表,完成 22 條 SQL 語句定義的計算需求(Q1 到 Q22)。測試采用單機 12 線程,數(shù)據(jù)總規(guī)模 100G。TPC-H 對應(yīng)的 SQL 都比較長,這里就不詳細列出了。Q1 是簡單的單表遍歷計算分組匯總,對比測試結(jié)果如下:

esProc SPL 登場
開源 esProc SPL 也是以高性能作為宣傳點,那么我們再來比較一下。仍然是跑 TPC-H 來看 :
這個測試的結(jié)果是下圖這樣:SELECT mod(id, 100) AS Aid, max(amount) AS Amax
FROM test.t
GROUP BY mod(id, 100)

SELECT * FROM test.t ORDER BY amount DESC LIMIT 100
對比測試結(jié)果是這樣的:
進一步的差距
差距還不止于此。正如前面所說,CH 和 ORA 使用 SQL 語言,都是基于關(guān)系模型的,所以都面臨 SQL 優(yōu)化的問題。TPC-H 測試證明,ORA 能優(yōu)化的一些場景 CH 卻優(yōu)化不了,甚至跑不出結(jié)果。那么,如果面對一些 ORA 也不會優(yōu)化的計算,CH 就更不會優(yōu)化了。比如說我們將 SQL1 的簡單分組匯總,改為兩種分組匯總結(jié)果再連接,CH 的 SQL 寫出來大致是這樣:SQL3:SELECT *
FROM (
SELECT mod(id, 100) AS Aid, max(amount) AS Amax
FROM test.t
GROUP BY mod(id, 100)
) A
JOIN(
SELECTfloor(id/200000)ASBid,min(amount)ASBmin
FROMtest.t
GROUPBYfloor(id/200000)
)B
ONA.Aid=B.Bid
這種情況下,對比測試的結(jié)果是 CH 的計算時間翻倍,SPL 則不變:

A | B | |
1 | =file("topn.ctx").open().cursor@mv(id,amount) | |
2 | cursor A1 | =A2.groups(id%100:Aid;max(amount):Amax) |
3 | cursor | =A3.groups(id200000:Bid;min(amount):Bmin) |
4 | =A2.join@i(Aid,A3:Bid,Bid,Bmin) |
再將 SQL2 常規(guī) TopN 計算,調(diào)整為分組后求組內(nèi) TopN。對應(yīng) SQL 是:
SQL4:SELECT
gid,
groupArray(100)(amount)ASamount
FROM
(
SELECT
mod(id, 10) AS gid,
amount
FROMtest.topn
ORDERBY
gid ASC,
amount DESC
)ASa
GROUPBYgid
這個分組 TopN 測試的對比結(jié)果是下面這樣的:

A | |
1 | =file("topn.ctx").open().cursor@mv(id,amount) |
2 | =A1.groups(id%10:gid;top(10;-amount)).news(#2;gid,~.amount) |
不只是跑得快
再來看看電商系統(tǒng)中常見的漏斗運算。SPL 的代碼依然很簡潔:A | B | |
1 | =["etype1","etype2","etype3"] | =file("event.ctx").open() |
2 |
=B1.cursor(id,etime,etype;etime>=date("2021-01-10") && etime |
|
3 | =A2.group(id).(~.sort(etime)) | =A3.new(~.select@1(etype==A1(1)):first,~:all).select(first) |
4 |
=B3.(A1.(t=if(#==1,t1=first.etime,if(t,all.select@1(etype==A1.~ && etime>t && etime |
|
5 | =A4.groups(;count(~(1)):STEP1,count(~(2)):STEP2,count(~(3)):STEP3) |
CH 的 SQL 無法實現(xiàn)這樣的計算,我們以 ORA 為例看看三步漏斗的 SQL 寫法:
ORA 的 SQL 寫出來要三十多行,理解起來有相當?shù)碾y度。而且這段代碼和漏斗的步驟數(shù)量相關(guān),每增加一步數(shù)就要再增加一段子查詢。相比之下,SPL 就簡單得多,處理任意步驟數(shù)都是這段代碼。這種復(fù)雜的 SQL,寫出來都很費勁,性能優(yōu)化更無從談起。而 CH 的 SQL 還遠不如 ORA,基本上寫不出這么復(fù)雜的邏輯,只能在外部寫 C++ 代碼實現(xiàn)。也就是說,這種情況下只能利用 CH 的存儲引擎。雖然用 C++ 在外部計算有可能獲得很好的性能,但開發(fā)成本非常高。類似的例子還有很多,CH 都無法直接實現(xiàn)。with e1 as (
select gid,1 as step1,min(etime) as t1
from T
where etime>= to_date('2021-01-10', 'yyyy-MM-dd') and etime<to_date('2021-01-25', 'yyyy-MM-dd')
and eventtype='eventtype1' and …
group by 1
),
with e2 as (
select gid,1 as step2,min(e1.t1) as t1,min(e2.etime) as t2
from T as e2
inner join e1 on e2.gid = e1.gid
where e2.etime>= to_date('2021-01-10', 'yyyy-MM-dd') and e2.etime<to_date('2021-01-25', 'yyyy-MM-dd')
and e2.etime > t1
and e2.etime < t1 + 7
and eventtype='eventtype2' and …
group 1
),
with e3 as (
select gid,1 as step3,min(e2.t1) as t1,min(e3.etime) as t3
from T as e3
inner join e2 on e3.gid = e2.gid
where e3.etime>= to_date('2021-01-10', 'yyyy-MM-dd') and e3.etime<to_date('2021-01-25', 'yyyy-MM-dd')
and e3.etime > t2
and e3.etime < t1 + 7
and eventtype='eventtype3' and …
group by 1
)
select
sum(step1) as step1,
sum(step2) as step2,
sum(step3) as step3
from
e1
left join e2 on e1.gid = e2.gid
left join e3 on e2.gid = e3.gid
總結(jié)一下:CH 計算某些簡單場景(比如單表遍歷)確實很快,和 SPL 的性能差不多。但是,高性能計算不能只看簡單情況快不快,還要權(quán)衡各種場景。對于復(fù)雜運算而言,SPL 不僅性能遠超 CH,代碼編寫也簡單很多。SPL 能覆蓋高性能數(shù)據(jù)計算的全場景,可以說是完勝 CH。
-
SQL
+關(guān)注
關(guān)注
1文章
783瀏覽量
45145 -
數(shù)據(jù)庫
+關(guān)注
關(guān)注
7文章
3926瀏覽量
66218 -
開源
+關(guān)注
關(guān)注
3文章
3688瀏覽量
43829
原文標題:ClickHouse 挺快,esProc SPL 更快
文章出處:【微信號:芋道源碼,微信公眾號:芋道源碼】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
Linux下AWTK與Qt的性能對比
談?wù)凷T的單片機分類及性能對比
arduino和stm32性能對比究竟誰更厲害?
高頻型直流充電機性能對比檢驗試驗總結(jié)報告

評論