Dans cette étude, je souhaitais examiner les améliorations de performance que l'on peut obtenir en utilisant la source de données ClickHouse plutÎt que PostgreSQL. Je connais les avantages en termes de performances que j'obtiens en utilisant ClickHouse. Ces avantages seront-ils maintenus si j'accÚde à ClickHouse depuis PostgreSQL grùce à un environnement de données étranger (FDW) ?
Les environnements de bases de donnĂ©es Ă©tudiĂ©s sont PostgreSQL v11, clickhousedb_fdw et la base de donnĂ©es ClickHouse. Au final, depuis PostgreSQL v11, nous allons exĂ©cuter diffĂ©rentes requĂȘtes SQL, routĂ©es Ă travers notre clickhousedb_fdw vers la base de donnĂ©es ClickHouse. Ensuite, nous verrons comment la performance du FDW se compare Ă celle des mĂȘmes requĂȘtes exĂ©cutĂ©es dans le PostgreSQL natif et le ClickHouse natif.
Base de données ClickHouse
ClickHouse est un systÚme de gestion de bases de données orienté colonnes, open source, qui peut atteindre des performances de 100 à 1000 fois supérieures à celles des approches traditionnelles des bases de données, capable de traiter plus d'un milliard de lignes en moins d'une seconde.
Clickhousedb_fdw
clickhousedb_fdw est un environnement de données étranger pour la base de données ClickHouse, ou FDW, qui est un projet open source de Percona. .
.
Comme vous le verrez, cela fournit un FDW pour ClickHouse, qui permet de faire SELECT from, et INSERT INTO, la base de données ClickHouse depuis le serveur PostgreSQL v11.
Le FDW prend en charge des fonctions avancées, telles que l'agrégation et les jointures. Cela améliore considérablement les performances en utilisant les ressources du serveur distant pour ces opérations gourmandes en ressources.
Environnement de benchmark
- Serveur Supermicro :
- Processeur IntelÂź XeonÂź CPU E5-2683 v3 @ 2.00GHz
- 2 sockets / 28 cĆurs / 56 threads
- Mémoire : 256 Go de RAM
- Stockage : SSD d'entreprise Samsung SM863 de 1,9 To
- SystĂšme de fichiers : ext4/xfs
- OS : Linux smblade01 4.15.0-42-generic #45~16.04.1-Ubuntu
- PostgreSQL : version 11
Tests de benchmark
Au lieu d'utiliser un jeu de données généré par la machine pour ce test, nous avons utilisé les données « Performance par temps, rapporté sur le temps de fonctionnement de l'opérateur » de 1987 à 2018. Vous pouvez accéder aux données .
La taille de la base de données est de 85 Go, avec une seule table de 109 colonnes.
RequĂȘtes de benchmark
Voici les requĂȘtes que j'ai utilisĂ©es pour comparer ClickHouse, clickhousedb_fdw et PostgreSQL.
Q#
La requĂȘte contient des agrĂ©gats et un groupe par
Q1
SĂLECTIONNEZ DayOfWeek, COUNT(*) AS c FROM ontime WHERE Year >= 2000 AND Year <= 2008 GROUP BY DayOfWeek ORDER BY c DESC;
Q2
SĂLECTIONNEZ DayOfWeek, COUNT(*) AS c FROM ontime WHERE DepDelay > 10 AND Year >= 2000 AND Year <= 2008 GROUP BY DayOfWeek ORDER BY c DESC;
Q3
SĂLECTIONNEZ Origin, COUNT(*) AS c FROM ontime WHERE DepDelay > 10 AND Year >= 2000 AND Year <= 2008 GROUP BY Origin ORDER BY c DESC LIMIT 10;
Q4
SĂLECTIONNEZ Carrier, COUNT() FROM ontime WHERE DepDelay > 10 AND Year = 2007 GROUP BY Carrier ORDER BY COUNT() DESC;
Q5
SĂLECTIONNEZ a.Carrier, c, c2, c1000/c2 AS c3 FROM ( SĂLECTIONNEZ Carrier, COUNT() AS c FROM ontime WHERE DepDelay > 10 AND Year = 2007 GROUP BY Carrier ) a INNER JOIN ( SĂLECTIONNEZ Carrier, COUNT(*) AS c2 FROM ontime WHERE Year = 2007 GROUP BY Carrier ) b ON a.Carrier = b.Carrier ORDER BY c3 DESC;
Q6
SĂLECTIONNEZ a.Carrier, c, c2, c1000/c2 AS c3 FROM ( SĂLECTIONNEZ Carrier, COUNT() AS c FROM ontime WHERE DepDelay > 10 AND Year >= 2000 AND Year = 2000 AND Year <= 2008 GROUP BY Carrier ) b ON a.Carrier = b.Carrier ORDER BY c3 DESC;
Q7
SĂLECTIONNEZ Carrier, AVG(DepDelay) * 1000 AS c3 FROM ontime WHERE Year >= 2000 AND Year <= 2008 GROUP BY Carrier;
Q8
SĂLECTIONNEZ Year, AVG(DepDelay) FROM ontime GROUP BY Year;
Q9
SĂLECTIONNEZ Year, COUNT(*) AS c1 FROM ontime GROUP BY Year;
Q10
SĂLECTIONNEZ AVG(cnt) FROM (SĂLECTIONNEZ Year, Month, COUNT(*) AS cnt FROM ontime WHERE DepDel15 = 1 GROUP BY Year, Month) a;
Q11
SĂLECTIONNEZ AVG(c1) FROM (SĂLECTIONNEZ Year, Month, COUNT(*) AS c1 FROM ontime GROUP BY Year, Month) a;
Q12
SĂLECTIONNEZ OriginCityName, DestCityName, COUNT(*) AS c FROM ontime GROUP BY OriginCityName, DestCityName ORDER BY c DESC LIMIT 10;
Q13
SĂLECTIONNEZ OriginCityName, COUNT(*) AS c FROM ontime GROUP BY OriginCityName ORDER BY c DESC LIMIT 10;
La requĂȘte contient des jointures
Q14
SĂLECTIONNEZ a.Year, c1/c2 FROM ( SĂLECTIONNEZ Year, COUNT()1000 AS c1 FROM ontime WHERE DepDelay > 10 GROUP BY Year) a INNER JOIN (SĂLECTIONNEZ Year, COUNT(*) AS c2 FROM ontime GROUP BY Year) b ON a.Year = b.Year ORDER BY a.Year;
Q15
SĂLECTIONNEZ a.Year, c1/c2 FROM ( SĂLECTIONNEZ Year, COUNT()1000 AS c1 FROM fontime WHERE DepDelay > 10 GROUP BY Year) a INNER JOIN (SĂLECTIONNEZ Year, COUNT(*) AS c2 FROM fontime GROUP BY Year) b ON a.Year = b.Year;
Table-1 : RequĂȘtes utilisĂ©es dans l'Ă©valuation
ExĂ©cutions de requĂȘtes
Voici les rĂ©sultats de chaque requĂȘte exĂ©cutĂ©e dans diffĂ©rentes configurations de base de donnĂ©es : PostgreSQL avec et sans index, ClickHouse propre et clickhousedb_fdw. Le temps est affichĂ© en millisecondes.
Q#
PostgreSQL
PostgreSQL (Indexed)
ClickHouse
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
Table-1 : Temps nĂ©cessaire pour exĂ©cuter les requĂȘtes utilisĂ©es dans l'Ă©valuation
Voir les résultats
Le graphique montre le temps d'exĂ©cution de la requĂȘte en millisecondes. L'axe X montre le numĂ©ro de la requĂȘte dans les tableaux ci-dessus, et l'axe Y montre le temps d'exĂ©cution en millisecondes. Les rĂ©sultats de ClickHouse et les donnĂ©es obtenues Ă partir de PostgreSQL via clickhousedb_fdw sont affichĂ©s. Le tableau montre qu'il existe une Ă©norme diffĂ©rence entre PostgreSQL et ClickHouse, mais une diffĂ©rence minimale entre ClickHouse et clickhousedb_fdw.

Ce graphique montre la diffĂ©rence entre ClickhouseDB et clickhousedb_fdw. Pour la plupart des requĂȘtes, les frais gĂ©nĂ©raux de FDW ne sont pas si importants et Ă peine significatifs, sauf pour Q12. Cette requĂȘte inclut des jointures et une clause ORDER BY. En raison de la clause ORDER BY GROUP/BY, le ORDER BY n'est pas omis jusqu'Ă ClickHouse.
Dans le tableau 2, nous observons une augmentation du temps des requĂȘtes Q12 et Q13. Je le rĂ©pĂšte, cela est dĂ» Ă la clause ORDER BY. Pour le confirmer, j'ai exĂ©cutĂ© les requĂȘtes Q-14 et Q-15 avec et sans la clause ORDER BY. Sans la clause ORDER BY, le temps d'exĂ©cution est de 259 ms, tandis qu'avec la clause ORDER BY, il est de 1364212. Pour dĂ©boguer cette requĂȘte, j'explique les deux requĂȘtes ici, et les rĂ©sultats de l'explication sont fournis.
Q15 : Sans clause ORDER BY
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";Q15 : RequĂȘte sans clause ORDER BY
PLAN DE REQUĂTE
Hash Join (coût=2250.00..128516.06 lignes=50000000 largeur=12)
Sortie : fontime."Year", (((count(*) * 1000)) / b.c2)
Unique interne : vrai Condition de hachage : (fontime."Year" = b."Year")
-> Scan à distance (coût=1.00..-1.00 lignes=100000 largeur=12)
Sortie : fontime."Year", ((count(*) * 1000))
Relations : Agrégation sur (fontime)
SQL Ă distance : SELECT "Year", (count(*) * 1000) FROM "default".ontime WHERE (("DepDelay" > 10)) GROUP BY "Year"
-> Hachage (coût=999.00..999.00 lignes=100000 largeur=12)
Sortie : b.c2, b."Year"
-> Scan de sous-requĂȘte sur b (coĂ»t=1.00..999.00 lignes=100000 largeur=12)
Sortie : b.c2, b."Year"
-> Scan à distance (coût=1.00..-1.00 lignes=100000 largeur=12)
Sortie : fontime_1."Year", (count(*))
Relations : Agrégation sur (fontime)
SQL Ă distance : SELECT "Year", count(*) FROM "default".ontime GROUP BY "Year"(16 lignes)Q14 : RequĂȘte avec clause ORDER BY
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";Q14 : Plan de requĂȘte avec clause ORDER BY
PLAN DE REQUĂTE
Merge Join (coĂ»t=2.00..628498.02 lignes=50000000 largeur=12) Â
Sortie : fontime."Year", (((count(*) * 1000)) / (count(*)))Â Â
Unique interne : vrai  Condition de fusion : (fontime."Year" = fontime_1."Year") Â
-> GroupAggregate (coĂ»t=1.00..499.01 lignes=1 largeur=12)   Â
Sortie : fontime."Year", (count(*) * 1000)Â Â Â Â Â
ClĂ© de groupe : fontime."Year"    Â
-> Scan Ă distance sur public.fontime (coĂ»t=1.00..-1.00 lignes=100000 largeur=4)       Â
SQL Ă distance : SELECT "Year" FROM "default".ontime WHERE (("DepDelay" > 10))
ORDER BY "Year" ASCÂ Â
-> GroupAggregate (coĂ»t=1.00..499.01 lignes=1 largeur=12)    Â
Sortie : fontime_1."Year", count(*)     ClĂ© de groupe : fontime_1."Year"    Â
-> Scan Ă distance sur public.fontime fontime_1 (coĂ»t=1.00..-1.00 lignes=100000 largeur=4)Â
      Â
SQL Ă distance : SELECT "Year" FROM "default".ontime ORDER BY "Year" ASC(16 lignes)Sortie
Les résultats de ces expériences montrent que ClickHouse offre une performance réellement excellente, et que clickhousedb_fdw propose les avantages de la performance de ClickHouse dans PostgreSQL. Bien qu'il y ait certains coûts associés à l'utilisation de clickhousedb_fdw, ceux-ci sont minimes et comparables à la performance atteinte lors d'une exécution native dans la base de données ClickHouse. Cela confirme également que fdw dans PostgreSQL fournit des résultats remarquables.
Chat Telegram sur Clickhouse
Chat Telegram sur PostgreSQL
Source : habr.com
