Analitikai lekérdezések teljesítményének tesztelése PostgreSQL-ben, ClickHouse-ban és clickhousedb_fdw-ben (PostgreSQL)

Ebben a tanulmányban azt szerettem volna látni, hogy a PostgreSQL helyett egy ClickHouse adatforrás használatával milyen teljesítményjavulás érhető el. Ismerem a ClickHouse használatából származó termelékenységi előnyöket. Továbbra is megmaradnak ezek az előnyök, ha a PostgreSQL-ből egy idegen adatcsomagoló (FDW) segítségével érem el a ClickHouse-t?

A vizsgált adatbázis-környezetek a következők: PostgreSQL v11, clickhousedb_fdw és ClickHouse adatbázis. Végső soron a PostgreSQL v11-től kezdve különféle SQL-lekérdezéseket fogunk futtatni a clickhousedb_fdw-n keresztül a ClickHouse adatbázisba. Ezután meglátjuk, hogy az FDW teljesítménye hogyan viszonyul ugyanazokhoz a lekérdezésekhez, amelyek a natív PostgreSQL-ben és a natív ClickHouse-ban futnak.

Clickhouse adatbázis

A ClickHouse egy nyílt forráskódú oszlopos adatbázis-kezelő rendszer, amely a hagyományos adatbázis-megközelítéseknél 100-1000-szer gyorsabb teljesítményt képes elérni, és több mint egymilliárd sort képes kevesebb mint egy másodperc alatt feldolgozni.

Clickhousedb_fdw

clickhousedb_fdw – A ClickHouse adatbázis vagy az FDW külső adatcsomagolója a Percona nyílt forráskódú projektje. Itt található egy link a projekt GitHub tárházához.

Márciusban írtam egy blogot, amely többet mond az FDW-ről.

Amint látni fogja, ez egy FDW-t biztosít a ClickHouse számára, amely lehetővé teszi a SELECT-et a ClickHouse adatbázisból, és INSERT INTO-t a PostgreSQL v11 szerverről.

Az FDW támogatja a fejlett funkciókat, például az összesítést és a csatlakozást. Ez jelentősen javítja a teljesítményt azáltal, hogy a távoli kiszolgáló erőforrásait használja ezekhez az erőforrás-igényes műveletekhez.

Benchmark környezet

  • Supermicro szerver:
    • Intel® Xeon® CPU E5-2683 v3 @ 2.00 GHz
    • 2 foglalat / 28 mag / 56 menet
    • Memória: 256GB RAM
    • Tárhely: Samsung SM863 1.9TB Enterprise SSD
    • Fájlrendszer: ext4/xfs
  • OS: Linux smblade01 4.15.0-42-generic #45~16.04.1-Ubuntu
  • PostgreSQL: 11-es verzió

Benchmark tesztek

Ahelyett, hogy ehhez a teszthez gépileg generált adatkészletet használtunk volna, a „Termékenység a kezelői idő szerint jelentett idő szerint” adatokat használtuk 1987 és 2018 között. Hozzáférhet az adatokhoz az itt elérhető scriptünk segítségével.

Az adatbázis mérete 85 GB, amely egy 109 oszlopból álló táblázatot biztosít.

Összehasonlító lekérdezések

Itt vannak azok a lekérdezések, amelyeket a ClickHouse, a clickhousedb_fdw és a PostgreSQL összehasonlításához használtam.

Q#
A lekérdezés összesítéseket és csoportosítást tartalmaz

Q1
SELECT DayOfWeek, count(*) AS c FROM ontime WHERE Év >= 2000 ÉS év <= 2008 GROUP BY DayOfWeek ORDER BY c DESC;

Q2
SELECT DayOfWeek, count(*) AS c FROM ontime WHERE DepDelay>10 ÉS év >= 2000 ÉS év <= 2008 GROUP BY DayOfWeek ORDER BY c DESC;

Q3
SELECT Origin, count(*) AS c FROM ontime WHERE DepDelay>10 ÉS év >= 2000 ÉS év <= 2008 GROUP BY Origin ORDER BY c DESC LIMIT 10;

Q4
SELECT szolgáltató, count() FROM ontime WHERE DepDelay>10 ÉS év = 2007 GROUP BY Carrier ORDER BY count() DESC;

Q5
SELECT a.Carrier, c, c2, c1000/c2 mint c3 FROM ( SELECT Carrier, count() AS c FROM ontime WHERE DepDelay>10 AND év=2007 GROUP BY Carrier ) a BELSŐ CSATLAKOZÁS ( SELECT Carrier,count(*) AS c2 FROM ontime WHERE Év=2007 GROUP BY Carrier)b on a.Carrier=b.Carrier ORDER BY c3 DESC;

Q6
SELECT a.Carrier, c, c2, c1000/c2 mint c3 FROM ( SELECT Carrier, count() AS c FROM ontime WHERE DepDelay>10 ÉS év >= 2000 ÉS év <= 2008 GROUP BY Carrier) a BELSŐ CSATLAKOZÁS ( VÁLASSZA SZÁLLÍTÓT, számolj (*) AS c2 FROM ontime WHERE Év >= 2000 ÉS év <= 2008 GROUP BY Carrier ) b on a.Carrier=b.Carrier ORDER BY c3 DESC;

Q7
SELECT Carrier, átlag (Megkésettség) * 1000 AS c3 FROM ontime WHERE Év >= 2000 ÉS év <= 2008 GROUP BY Carrier;

Q8
VÁLASZTÁS Év, átlag(Megkésés) FROM ontime GROUP BY Year;

Q9
válasszuk az Évet, a count(*) c1-et az ontime csoportból év szerint;

Q10
SELECT avg(cnt) FROM (SELECT Év,Hónap,count(*) AS cnt FROM ontime WHERE DepDel15=1 GROUP BY Year,Hónap) a;

Q11
válasszon avg(c1) from (Válasszon Év,Hónap,count(*) as c1 from ontime csoport Év,Hónap szerint) a;

Q12
SELECT OriginCityName, DestCityName, count(*) AS c FROM ontime GROUP BY OriginCityName, DestCityName ORDER BY c DESC LIMIT 10;

Q13
SELECT OriginCityName, count(*) AS c FROM ontime GROUP BY OriginCityName ORDER BY c DESC LIMIT 10;

A lekérdezés csatlakozásokat tartalmaz

Q14
SELECT a.Year, c1/c2 FROM ( Select Year, count()1000, mint c1 az időponttól WHERE DepDelay>10 GROUP BY Year) a BELSŐ CSATLAKOZÁS (Válassza ki az Évet, számolja (*) c2-ként az időponttól GROUP BY Year ) b on a.Year=b.Year ORDER BY a.Year;

Q15
SELECT a."Year", c1/c2 FROM ( válassza az "Év", count()1000, mint c1 FROM fontime WHERE “DepDelay”>10 GROUP BY “Year”) a BELSŐ JOIN (válassza az “Év”-t, számoljon (*)-ként c2-ként FROM fontime-tól GROUP BY “Year”) b on a.”Year”=b. "Év";

1. táblázat: A benchmarkban használt lekérdezések

Végrehajtások lekérdezése

Íme az egyes lekérdezések eredményei, amikor különböző adatbázis-beállításokban futnak: PostgreSQL indexekkel és anélkül, natív ClickHouse és clickhousedb_fdw. Az idő ezredmásodpercben jelenik meg.

Q#
PostgreSQL
PostgreSQL (indexelt)
Kattintson a Ház gombra
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

1. táblázat: A benchmarkban használt lekérdezések végrehajtásához szükséges idő

Eredmények megtekintése

A grafikon a lekérdezés végrehajtási idejét mutatja ezredmásodpercben, az X tengely a fenti táblázatokból származó lekérdezés számát, az Y tengely pedig a végrehajtási időt ezredmásodpercben. Megjelennek a ClickHouse eredményei és a postgres-ből a clickhousedb_fdw használatával lekért adatok. A táblázatból látható, hogy óriási különbség van a PostgreSQL és a ClickHouse között, de minimális a különbség a ClickHouse és a clickhousedb_fdw között.

Analitikai lekérdezések teljesítményének tesztelése PostgreSQL-ben, ClickHouse-ban és clickhousedb_fdw-ben (PostgreSQL)

Ez a grafikon a ClickhouseDB és a clickhousedb_fdw közötti különbséget mutatja. A legtöbb lekérdezésben az FDW rezsi nem olyan magas, és aligha jelentős, kivéve a Q12-t. Ez a lekérdezés csatlakozásokat és egy ORDER BY záradékot tartalmaz. Az ORDER BY GROUP/BY záradék miatt az ORDER BY nem jelenik meg a ClickHouse-ban.

A 2. táblázatban láthatjuk a Q12 és Q13 lekérdezések időugrását. Ezt ismét az ORDER BY záradék okozza. Ennek megerősítésére lefuttattam a Q-14 és Q-15 lekérdezéseket az ORDER BY záradékkal és anélkül. Az ORDER BY záradék nélkül a befejezési idő 259 ms, az ORDER BY záradékkal pedig 1364212. A lekérdezés hibakereséséhez mindkét lekérdezést elmagyarázom, és itt vannak a magyarázat eredményei.

15. kérdés: ORDER BY záradék nélkül

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. kérdés: Lekérdezés ORDER BY záradék nélkül

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. kérdés: Lekérdezés ORDER BY záradékkal

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. kérdés: Lekérdezési terv ORDER BY záradékkal

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)

Teljesítmény

A kísérletek eredményei azt mutatják, hogy a ClickHouse igazán jó teljesítményt nyújt, a clickhousedb_fdw pedig a PostgreSQL ClickHouse teljesítménybeli előnyeit kínálja. Bár a clickhousedb_fdw használatakor van némi többletköltség, ez elhanyagolható és összehasonlítható a ClickHouse adatbázison való natív futtatással elért teljesítménnyel. Ez is megerősíti, hogy az fdw a PostgreSQL-ben kiváló eredményeket biztosít.

Telegram chat a Clickhouse-on keresztül https://t.me/clickhouse_ru
Telegram chat PostgreSQL használatával https://t.me/pgsql

Forrás: will.com

Hozzászólás