Kujaribu utendakazi wa hoja za uchanganuzi katika PostgreSQL, ClickHouse na clickhousedb_fdw (PostgreSQL)

Katika utafiti huu, nilitaka kuona ni maboresho gani ya utendaji yanaweza kupatikana kwa kutumia chanzo cha data cha ClickHouse badala ya PostgreSQL. Ninajua faida za tija ninazopata kwa kutumia ClickHouse. Je, manufaa haya yataendelea nikifikia ClickHouse kutoka PostgreSQL kwa kutumia Kifuniko cha Data ya Kigeni (FDW)?

Mazingira ya hifadhidata yaliyosomwa ni PostgreSQL v11, clickhousedb_fdw na hifadhidata ya ClickHouse. Hatimaye, kutoka PostgreSQL v11 tutakuwa tukiendesha hoja mbalimbali za SQL zikipitishwa kupitia clickhousedb_fdw yetu hadi kwenye hifadhidata ya ClickHouse. Kisha tutaona jinsi utendaji wa FDW unavyolinganishwa na maswali sawa yanayoendeshwa katika PostgreSQL asilia na ClickHouse asili.

Hifadhidata ya Bofya

ClickHouse ni mfumo wa usimamizi wa hifadhidata wa safu huria wa chanzo huria ambao unaweza kufikia utendaji mara 100-1000 kwa kasi zaidi kuliko mbinu za jadi za hifadhidata, wenye uwezo wa kuchakata zaidi ya safu mlalo bilioni kwa chini ya sekunde moja.

Bonyezahousedb_fdw

clickhousedb_fdw - Kifunga data cha nje cha hifadhidata ya ClickHouse, au FDW, ni mradi wa chanzo huria kutoka Percona. Hapa kuna kiunga cha hazina ya mradi wa GitHub.

Mnamo Machi niliandika blogi ambayo inakuambia zaidi kuhusu FDW yetu.

Kama utakavyoona, hii hutoa FDW kwa ClickHouse ambayo inaruhusu SELECT kutoka, na INSERT INTO, hifadhidata ya ClickHouse kutoka kwa seva ya PostgreSQL v11.

FDW inasaidia vipengele vya kina kama vile kujumlisha na kujiunga. Hii inaboresha utendaji kwa kiasi kikubwa kwa kutumia rasilimali za seva ya mbali kwa shughuli hizi zinazotumia rasilimali nyingi.

Mazingira ya benchmark

  • Seva ya Supermicro:
    • Intel® Xeon® CPU E5-2683 v3 @ 2.00GHz
    • Soketi 2 / cores 28 / nyuzi 56
    • Kumbukumbu: 256GB ya RAM
    • Hifadhi: Samsung SM863 1.9TB Enterprise SSD
    • Mfumo wa faili: ext4/xfs
  • Mfumo wa Uendeshaji: Linux smblade01 4.15.0-42-generic #45~16.04.1-Ubuntu
  • PostgreSQL: toleo la 11

Vipimo vya benchmark

Badala ya kutumia baadhi ya data inayozalishwa na mashine kwa ajili ya jaribio hili, tulitumia data ya "Tija kwa Muda Ulioripotiwa wa Opereta" kuanzia 1987 hadi 2018. Unaweza kufikia data kwa kutumia hati yetu inayopatikana hapa.

Saizi ya hifadhidata ni GB 85, ​​ikitoa jedwali moja la safu wima 109.

Maswali ya Benchmark

Hapa kuna maswali niliyotumia kulinganisha ClickHouse, clickhousedb_fdw na PostgreSQL.

Q#
Hoja Ina Aggregates na Group By

Q1
CHAGUA DayOfWeek, count(*) AS c KUTOKA kwa wakati AMBAPO Year >= 2000 NA Mwaka <= 2008 GROUP BY DayOfWeek ORDER BY c DESC;

Q2
CHAGUA DayOfWeek, count(*) AS c KUTOKA kwa wakati AMBAPO DepDelay>10 NA Mwaka >= 2000 NA Mwaka <= 2008 GROUP BY DayOfWeek ORDER BY c DESC;

Q3
CHAGUA Asili, hesabu(*) AS c KUTOKA kwa wakati AMBAPO DepDelay>10 NA Mwaka >= 2000 NA Mwaka <= 2008 GROUP BY Origin ORDER BY c DESC LIMIT 10;

Q4
CHAGUA Mtoa huduma, hesabu () KUTOKA kwa wakati ambapo DepDelay>10 NA Mwaka = 2007 KUNDI KWA Mtoa huduma AGIZO KWA hesabu() DESC;

Q5
CHAGUA a.Mbebaji, c, c2, c1000/c2 kama c3 KUTOKA ( CHAGUA Mtoa huduma, hesabu() AS c KUTOKA kwa wakati ambapo DepDelay>10 NA Year=2007 KUNDI KWA Mtoa huduma ) JIUNGE NDANI ( CHAGUA Mtoa huduma,hesabu(*) AS c2 KUTOKA kwa wakati ambapo Year=2007 KUNDI KWA Mtoa huduma)b kwenye a.Carrier=b.AGIZO la Mtoa huduma KWA c3 DESC;

Q6
CHAGUA a.Mbebaji, c, c2, c1000/c2 kama c3 KUTOKA ( CHAGUA Mtoa huduma, hesabu() AS c KUTOKA ontime AMBAPO DepDelay>10 NA Mwaka >= 2000 NA Mwaka <= 2008 GROUP BY Carrier) JIUNGE NDANI ( CHAGUA Mtoa huduma, hesabu(*) AS c2 KUTOKA KWA WAKATI WAPI Mwaka >= 2000 NA Mwaka <= 2008 GROUP BY Mtoa huduma ) b kwenye a.Carrier=b.AGIZO la Mtoa huduma BY c3 DESC;

Q7
CHAGUA Mtoa huduma, avg(DepDelay) * 1000 AS c3 KUTOKA kwa wakati AMBAPO Mwaka >= 2000 NA Mwaka <= 2008 KUNDI KWA Mtoa huduma;

Q8
CHAGUA Mwaka, wastani(DepDelay) KUTOKA kwa wakati wa KUNDI KWA Mwaka;

Q9
chagua Mwaka, hesabu (*) kama c1 kutoka kwa kikundi cha wakati kwa Mwaka;

Q10
CHAGUA wastani(cnt) KUTOKA (CHAGUA Mwaka,Mwezi,hesabu(*) AS cnt FROM ontime AMBAPO DepDel15=1 KUNDI KWA Mwaka,Mwezi) a;

Q11
chagua avg(c1) kutoka (chagua Mwaka,Mwezi,hesabu(*) kama c1 kutoka kwa kikundi cha wakati kwa Mwaka,Mwezi) a;

Q12
CHAGUA OriginCityName, DestCityName, count(*) AS c KUTOKA kwa wakati WA KUNDI KWA OriginCityName, DestCityName ORDER BY c DESC LIMIT 10;

Q13
CHAGUA OriginCityName, hesabu(*) AS c KUTOKA kwa wakati WA KUNDI KWA OriginCityName AGIZA KWA c DESC LIMIT 10;

Hoja Ina Viungio

Q14
CHAGUA a.Year, c1/c2 KUTOKA ( chagua Mwaka, hesabu()1000 kama c1 kutoka kwa wakati AMBAPO DepDelay>KUNDI 10 KWA Mwaka) KUJIUNGA KWA NDANI (chagua Mwaka, hesabu(*) kama c2 kutoka kwa wakati GROUP BY Year ) b kwa A.Year=b.Mwaka BY Mwaka;

Q15
CHAGUA."Mwaka", c1/c2 KUTOKA ( chagua "Mwaka", hesabu()1000 kama c1 KUTOKA fontime AMBAPO “DepDelay”>10 KUNDI KWA “Mwaka”) KUJIUNGA KWA NDANI (chagua “Mwaka”, hesabu(*) kama c2 KUTOKA KUNDI LA fontime KWA “Mwaka” ) b kwenye.”Mwaka”=b. "Mwaka";

Jedwali-1: Hoja zinazotumika katika kipimo

Utekelezaji wa hoja

Haya hapa ni matokeo ya kila hoja inapoendeshwa katika mipangilio tofauti ya hifadhidata: PostgreSQL iliyo na na bila faharasa, ClickHouse asili na clickhousedb_fdw. Muda unaonyeshwa kwa milisekunde.

Q#
PostgreSQL
PostgreSQL (Fahirisi)
Bonyeza Nyumba
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

Jedwali-1: Muda uliochukuliwa kutekeleza hoja zilizotumika katika ulinganifu

Tazama matokeo

Grafu inaonyesha muda wa utekelezaji wa hoja katika milisekunde, mhimili wa X unaonyesha nambari ya hoja kutoka kwa majedwali yaliyo hapo juu, na mhimili wa Y unaonyesha muda wa utekelezaji katika milisekunde. Matokeo ya BofyaHouse na data iliyopatikana kutoka kwa postgres kwa kutumia clickhousedb_fdw inaonyeshwa. Kutoka kwa jedwali unaweza kuona kwamba kuna tofauti kubwa kati ya PostgreSQL na ClickHouse, lakini tofauti ndogo kati ya ClickHouse na clickhousedb_fdw.

Kujaribu utendakazi wa hoja za uchanganuzi katika PostgreSQL, ClickHouse na clickhousedb_fdw (PostgreSQL)

Grafu hii inaonyesha tofauti kati ya ClickhouseDB na clickhousedb_fdw. Katika hoja nyingi, sehemu ya juu ya FDW si ya juu kiasi hicho na haina umuhimu wowote isipokuwa Q12. Hoja hii inajumuisha viungio na kifungu cha ORDER BY. Kwa sababu ya ORDER BY GROUP/BY clause, ORDER BY haishuki chini kwa ClickHouse.

Katika Jedwali la 2 tunaona wakati unaruka katika maswali Q12 na Q13. Tena, hii inasababishwa na ORDER BY clause. Ili kuthibitisha hili, niliendesha maswali Q-14 na Q-15 na bila ya kifungu cha ORDER BY. Bila ORDER BY clause muda wa kukamilisha ni 259ms na kwa ORDER BY clause ni 1364212. Ili kutatua swala hili ninaelezea maswali yote mawili na haya hapa ni matokeo ya maelezo.

Swali la 15: Bila AGIZO KWA Kifungu

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";

Swali la 15: Swali Bila AGIZO KWA Kifungu

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)

Swali la 14: Hoja Kwa AGIZO KWA Kifungu

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";

Swali la 14: Mpango wa Hoji kwa AMRI KWA Kifungu

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)

Pato

Matokeo ya majaribio haya yanaonyesha kuwa ClickHouse inatoa utendakazi mzuri sana, na clickhousedb_fdw inatoa manufaa ya utendaji ya ClickHouse kutoka PostgreSQL. Ingawa kuna sehemu ya juu unapotumia clickhousedb_fdw, haitumiki na inalinganishwa na utendakazi unaopatikana kwa kuendesha kienyeji kwenye hifadhidata ya ClickHouse. Hii pia inathibitisha kuwa fdw katika PostgreSQL hutoa matokeo bora.

Gumzo la Telegraph kupitia Clickhouse https://t.me/clickhouse_ru
Gumzo la telegraph kwa kutumia PostgreSQL https://t.me/pgsql

Chanzo: mapenzi.com

Kuongeza maoni