Bu araşdırmada PostgreSQL deyil, ClickHouse məlumat mənbəyindən istifadə etməklə hansı performans təkmilləşdirmələrinin əldə oluna biləcəyini görmək istədim. ClickHouse istifadə edərək əldə etdiyim məhsuldarlıq faydalarını bilirəm. Xarici Məlumat Qapağı (FDW) istifadə edərək PostgreSQL-dən ClickHouse-a daxil olsam, bu üstünlüklər davam edəcəkmi?
Tədqiq olunan verilənlər bazası mühitləri PostgreSQL v11, clickhousedb_fdw və ClickHouse verilənlər bazasıdır. Nəhayət, PostgreSQL v11-dən biz clickhousedb_fdw vasitəsilə ClickHouse verilənlər bazasına yönləndirilən müxtəlif SQL sorğularını icra edəcəyik. Sonra FDW-nin performansının yerli PostgreSQL və yerli ClickHouse-da işləyən eyni sorğularla necə müqayisə olunduğunu görəcəyik.
Clickhouse verilənlər bazası
ClickHouse açıq mənbəli sütunlu verilənlər bazası idarəetmə sistemidir, performansı ənənəvi verilənlər bazası yanaşmalarından 100-1000 dəfə daha sürətli əldə edə bilir, bir saniyədən az müddətdə milyarddan çox satırı emal edə bilir.
Clickhousedb_fdw
clickhousedb_fdw - ClickHouse verilənlər bazası və ya FDW üçün xarici məlumat paketi Percona-dan açıq mənbə layihəsidir.
Gördüyünüz kimi, bu, PostgreSQL v11 serverindən ClickHouse verilənlər bazasından SEÇMƏ və INSERT INTO imkan verən ClickHouse üçün FDW təmin edir.
FDW toplama və qoşulma kimi qabaqcıl xüsusiyyətləri dəstəkləyir. Bu, bu resurs tutumlu əməliyyatlar üçün uzaq serverin resurslarından istifadə etməklə performansı əhəmiyyətli dərəcədə yaxşılaşdırır.
Benchmark mühiti
- Supermicro server:
- Intel® Xeon® CPU E5-2683 v3 @ 2.00GHz
- 2 yuva / 28 nüvə / 56 ip
- Yaddaş: 256GB operativ yaddaş
- Yaddaş: Samsung SM863 1.9TB Enterprise SSD
- Fayl sistemi: ext4/xfs
- ƏS: Linux smblade01 4.15.0-42-generic #45~16.04.1-Ubuntu
- PostgreSQL: versiya 11
Benchmark testləri
Bu test üçün bəzi maşın tərəfindən yaradılan məlumat dəstindən istifadə etmək əvəzinə, biz 1987-ci ildən 2018-ci ilə qədər "Məhsuldarlığın Məlumatlı Operator Vaxtı" məlumatından istifadə etdik. Məlumatlara daxil ola bilərsiniz
Verilənlər bazası ölçüsü 85 sütundan ibarət bir cədvəl təmin edən 109 GB-dır.
Benchmark Sorğuları
ClickHouse, clickhousedb_fdw və PostgreSQL-i müqayisə etmək üçün istifadə etdiyim sorğular bunlardır.
Q#
Sorğu Aqreqatları və Qrupları ehtiva edir
Q1
HƏFTƏNİN GÜNÜNÜ SEÇİN, (*) c kimi hesablayın, HARƏDƏ İl >= 2000 VƏ 2008 <= XNUMX-ci il Həftənin Gününə görə QRUP SİFARİŞ EDİN.
Q2
HƏFTƏNİN GÜNÜNÜ SEÇİN, HARƏDƏ DepGecikmə>10 VƏ İl >= 2000 VƏ 2008 İli <= XNUMX-ci ilin vaxtından etibarən c kimi hesablayın.
Q3
Mənşəyi SEÇİN, (*) c kimi hesablayın HARƏDƏ DepDelay>10 VƏ İl >= 2000 VƏ İl <= 2008 Mənşə GÖRƏ QRUP SİFARİŞ C DESC LIMIT 10;
Q4
Daşıyıcını SEÇİN, sayın() VAXTINDAN HARADA DepDelay>10 VƏ İl = 2007 QRUP Daşıyıcıya GÖRƏ SİFARİŞ Sayıya görə() DESC;
Q5
SEÇİN a.Daşıyıcı, c, c2, c1000/c2 kimi c3 FROM ( Daşıyıcı SEÇ, say() AS c vaxtında HARƏDƏ DepDelay>10 VƏ 2007-ci il=Daşıyıcıya görə QRUP ) a DAXİLİ BİRLƏŞMƏ ( Daşıyıcı SEÇ,(*) c2 kimi hesabla, VAXTINDAN HARA İl=2007 Daşıyıcıya görə Qrup)b a.Daşıyıcıda=b.Daşıyıcı SİFARİŞ BY c3 DESC;
Q6
SEÇİN a.Daşıyıcı, c, c2, c1000/c2 kimi c3 FROM ( Daşıyıcı SEÇ, say() AS c vaxtında HARƏDƏ DepDelay>10 VƏ İl >= 2000 VƏ İLLƏR <= 2008 QRUP Daşıyıcıya görə) a DAXİLİ QOŞULMA ( Daşıyıcı SEÇİN, c2 kimi sayın(*) HARƏDƏ İl >= 2000 VƏ İl <= 2008 GRO UP Daşıyıcı ) b-də a.Daşıyıcı=b.Daşıyıcı SİFARİŞ BY c3 AÇIQLAMA;
Q7
Daşıyıcı SEÇİN, orta(DepDelay) * 1000 AS c3 VAXTINDAN HARADA İl >= 2000 VƏ İl <= 2008 Daşıyıcıya görə QRUP;
Q8
İl SEÇİN, orta(DepGecikdirmə) İlə GÖRƏ vaxtında QRUPDAN;
Q9
İl seçin, İllər üzrə iş vaxtı qrupundan c1 kimi hesablayın (*);
Q10
SEÇİN orta(cnt) FROM (İl,Ay,say(*) AS cnt FROM VAXTINDA SEÇİN HARƏDƏ DepDel15=İlə,Aya görə 1 QRUP) a;
Q11
orta (c1) arasından seçin (İl,Ay,say(*) kimi c1 kimi iş vaxtı qrupundan İl,Ay seçin) a;
Q12
SEÇİN OriginCityName, DestCityName, count(*) AS c FROM VAXTINDA QRUP OriginCityName BY, DestCityName SİPARİŞ BY c DESC LIMIT 10;
Q13
OriginCityName SEÇİN, (*) AS c AS QRUP OriginCityName BY SİFARİŞ BY SİFARİŞ QRUP AŞAĞILIQ LİMİT;
Sorğuda Qoşulmalar var
Q14
SEÇİN a.İl, c1/c2 FROM ( İl, say seçin()1000 vaxtından c1 olaraq HARADA DepDelay>10 QRUP İlə) a DAXİLİ QOŞULUŞ (İl seçin, c2 kimi sayın(*) İlə görə QRUP ) b a.İl=b.İlə SİFARİŞ a.İlə;
Q15
SEÇİN a.”İl”, c1/c2 FROM ( “İl seçin”, say()1000 olaraq c1 fontime FROM HERDE “DepDelay”>10 QROUP BY “Year”) a DAXİLİ QOŞULUŞ (“İl” seçin, c2 kimi sayın(*) fontime QRUP “İl” ) b üzrə a.”İl”=b. "İl";
Cədvəl-1: Bençmarkda istifadə edilən sorğular
Sorğu icraları
Budur, müxtəlif verilənlər bazası parametrlərində işlədilmiş sorğuların hər birinin nəticələri: indeksli və indekssiz PostgreSQL, yerli ClickHouse və clickhousedb_fdw. Vaxt millisaniyələrlə göstərilir.
Q#
PostgreSQL
PostgreSQL (İndeksli)
Basın Evi
clickhousedb_fdw
Q1
27920
19634
23
57
Q2
35124
17301
50
80
Q3
34046
15618
67
115
Q4
31632
7667
25
37
Q5
47220
8976
27
60
Q6
58233
24368
55
153
Q7
30566
13256
52
91
Q8
38309
60511
112
179
Q9
20674
37979
31
81
Q10
34990
20102
56
148
Q11
30489
51658
37
155
Q12
39357
33742
186
1333
Q13
29912
30709
101
384
Q14
54126
39913
124
1364212
Q15
97258
30211
245
259
Cədvəl-1: Bençmarkda istifadə edilən sorğuların yerinə yetirilməsi üçün sərf olunan vaxt
Nəticələrə baxın
Qrafik sorğunun icra müddətini millisaniyələrlə, X oxu yuxarıdakı cədvəllərdən sorğu nömrəsini, Y oxu isə icra müddətini millisaniyələrlə göstərir. ClickHouse nəticələri və clickhousedb_fdw istifadə edərək postgres-dən alınan məlumatlar göstərilir. Cədvəldən görə bilərsiniz ki, PostgreSQL və ClickHouse arasında böyük fərq var, lakin ClickHouse və clickhousedb_fdw arasında minimal fərq var.
Bu qrafik ClickhouseDB və clickhousedb_fdw arasındakı fərqi göstərir. Əksər sorğularda FDW əlavə xərcləri Q12 istisna olmaqla, o qədər də yüksək deyil və çətin ki, əhəmiyyətlidir. Bu sorğuya birləşmələr və ORDER BY bəndi daxildir. ORDER BY GROUP/BY bəndinə görə ORDER BY ClickHouse-a düşmür.
Cədvəl 2-də biz Q12 və Q13 sorğularında vaxt sıçrayışını görürük. Yenə də buna ORDER BY bəndi səbəb olur. Bunu təsdiqləmək üçün mən Q-14 və Q-15 sorğularını ORDER BY bəndi ilə və olmadan icra etdim. ORDER BY bəndi olmadan tamamlama vaxtı 259ms, ORDER BY bəndi ilə isə 1364212-dir. Bu sorğuda debug etmək üçün mən həm sorğuları izah edirəm və burada izahatın nəticələri var.
Q15: SİFARİŞ BY Maddə olmadan
bm=# EXPLAIN VERBOSE SELECT a."Year", c1/c2
FROM (SELECT "Year", count(*)*1000 AS c1 FROM fontime WHERE "DepDelay" > 10 GROUP BY "Year") a
INNER JOIN(SELECT "Year", count(*) AS c2 FROM fontime GROUP BY "Year") b ON a."Year"=b."Year";
15-ci sual: ORDER BY bəndi olmadan sorğu
QUERY PLAN
Hash Join (cost=2250.00..128516.06 rows=50000000 width=12)
Output: fontime."Year", (((count(*) * 1000)) / b.c2)
Inner Unique: true Hash Cond: (fontime."Year" = b."Year")
-> Foreign Scan (cost=1.00..-1.00 rows=100000 width=12)
Output: fontime."Year", ((count(*) * 1000))
Relations: Aggregate on (fontime)
Remote SQL: SELECT "Year", (count(*) * 1000) FROM "default".ontime WHERE (("DepDelay" > 10)) GROUP BY "Year"
-> Hash (cost=999.00..999.00 rows=100000 width=12)
Output: b.c2, b."Year"
-> Subquery Scan on b (cost=1.00..999.00 rows=100000 width=12)
Output: b.c2, b."Year"
-> Foreign Scan (cost=1.00..-1.00 rows=100000 width=12)
Output: fontime_1."Year", (count(*))
Relations: Aggregate on (fontime)
Remote SQL: SELECT "Year", count(*) FROM "default".ontime GROUP BY "Year"(16 rows)
14-cü sual: ORDER BY bəndi ilə sorğu
bm=# EXPLAIN VERBOSE SELECT a."Year", c1/c2 FROM(SELECT "Year", count(*)*1000 AS c1 FROM fontime WHERE "DepDelay" > 10 GROUP BY "Year") a
INNER JOIN(SELECT "Year", count(*) as c2 FROM fontime GROUP BY "Year") b ON a."Year"= b."Year"
ORDER BY a."Year";
14-cü Qrup: ORDER BY Maddə ilə Sorğu Planı
QUERY PLAN
Merge Join (cost=2.00..628498.02 rows=50000000 width=12)
Output: fontime."Year", (((count(*) * 1000)) / (count(*)))
Inner Unique: true Merge Cond: (fontime."Year" = fontime_1."Year")
-> GroupAggregate (cost=1.00..499.01 rows=1 width=12)
Output: fontime."Year", (count(*) * 1000)
Group Key: fontime."Year"
-> Foreign Scan on public.fontime (cost=1.00..-1.00 rows=100000 width=4)
Remote SQL: SELECT "Year" FROM "default".ontime WHERE (("DepDelay" > 10))
ORDER BY "Year" ASC
-> GroupAggregate (cost=1.00..499.01 rows=1 width=12)
Output: fontime_1."Year", count(*) Group Key: fontime_1."Year"
-> Foreign Scan on public.fontime fontime_1 (cost=1.00..-1.00 rows=100000 width=4)
Remote SQL: SELECT "Year" FROM "default".ontime ORDER BY "Year" ASC(16 rows)
Buraxılış
Bu təcrübələrin nəticələri göstərir ki, ClickHouse həqiqətən yaxşı performans təklif edir və clickhousedb_fdw PostgreSQL-dən ClickHouse-un performans üstünlüklərini təklif edir. Clickhousedb_fdw istifadə edərkən bir qədər əlavə xərc olsa da, bu, əhəmiyyətsizdir və ClickHouse verilənlər bazasında yerli olaraq işləməklə əldə edilən performansla müqayisə edilə bilər. Bu da PostgreSQL-də fdw-nin əla nəticələr verdiyini təsdiqləyir.
Clickhouse vasitəsilə Telegram söhbəti
PostgreSQL istifadə edərək Telegram söhbəti
Mənbə: www.habr.com