Санҷиши иҷрои дархостҳои таҳлилӣ дар PostgreSQL, ClickHouse ва clickhousedb_fdw (PostgreSQL)

Дар ин таҳқиқот, ман мехостам бубинам, ки чӣ гуна беҳбудиҳоро тавассути истифодаи манбаи маълумоти ClickHouse ба ҷои PostgreSQL ба даст овардан мумкин аст. Ман медонам, ки манфиатҳои ҳосилнокӣ, ки ман аз истифодаи ClickHouse мегирам. Оё ин имтиёзҳо идома хоҳанд ёфт, агар ман аз PostgreSQL бо истифода аз Wrapper маълумотҳои хориҷӣ (FDW) ба ClickHouse дастрасӣ пайдо кунам?

Муҳитҳои пойгоҳи додаҳо PostgreSQL v11, clickhousedb_fdw ва пойгоҳи додаҳои ClickHouse мебошанд. Дар ниҳоят, аз PostgreSQL v11 мо дархостҳои гуногуни SQL-ро иҷро хоҳем кард, ки тавассути clickhousedb_fdw мо ба базаи ClickHouse равона карда мешаванд. Сипас мо мебинем, ки чӣ тавр иҷрои FDW бо ҳамон дархостҳое, ки дар PostgreSQL ва ClickHouse-и ватанӣ иҷро мешаванд, муқоиса мекунад.

Пойгоҳи маълумоти Clickhouse

ClickHouse як системаи идоракунии пойгоҳи додаҳои сутунии кушодаасос мебошад, ки метавонад нисбат ба равишҳои анъанавии пойгоҳи додаҳо 100-1000 маротиба тезтар ба даст ояд, ки қодир аст беш аз як миллиард сатрро дар камтар аз як сония коркард кунад.

Clickhousedb_fdw

clickhousedb_fdw - Сарпӯши додаҳои беруна барои махзани ClickHouse ё FDW лоиҳаи кушодаасос аз Percona мебошад. Ин аст пайванд ба анбори GitHub лоиҳа.

Дар моҳи март ман блоге навиштам, ки ба шумо дар бораи FDW-и мо бештар нақл мекунад.

Тавре ки шумо хоҳед дид, ин FDW-ро барои ClickHouse таъмин мекунад, ки имкон медиҳад SELECT аз базаи ClickHouse аз сервери PostgreSQL v11 ва INSERT INTO дода шавад.

FDW хусусиятҳои пешрафтаро ба монанди ҷамъ кардан ва ҳамроҳшавӣ дастгирӣ мекунад. Ин бо истифода аз захираҳои сервери дурдаст барои ин амалиётҳои серталаб иҷрои корҳоро ба таври назаррас беҳтар мекунад.

Муҳити бенчмарк

  • Сервери Supermicro:
    • Intel® Xeon® CPU E5-2683 v3 @ 2.00 ГГц
    • 2 розетка / 28 ядро ​​​​/ 56 ришта
    • Хотира: 256 ГБ RAM
    • Нигоҳдорӣ: Samsung SM863 1.9TB Enterprise SSD
    • Системаи файлӣ: ext4/xfs
  • OS: Linux smblade01 4.15.0-42-умумӣ #45~16.04.1-Ubuntu
  • PostgreSQL: версияи 11

Санҷишҳои муқоисавӣ

Ба ҷои истифодаи баъзе маҷмӯаи маълумоте, ки аз ҷониби мошин тавлидшуда барои ин озмоиш, мо маълумоти "Маҳсулнокӣ аз рӯи вақти гузоришшудаи вақти оператор" -ро аз соли 1987 то 2018 истифода бурдем. Шумо метавонед ба маълумот дастрасӣ пайдо кунед бо истифода аз скрипти мо дар ин ҷо дастрас аст.

Андозаи пойгоҳи додаҳо 85 ГБ буда, як ҷадвали 109 сутунро таъмин мекунад.

Саволҳои муқоисавӣ

Инҳоянд дархостҳое, ки ман барои муқоиса кардани ClickHouse, clickhousedb_fdw ва PostgreSQL истифода кардам.

Q#
Дархост дорои агрегатҳо ва гурӯҳҳо мебошад

Q1
ИНТИХОБ КАРДАНИ Рӯзи Ҳафта, ҳисоб кунед(*) AS c АЗ вақти дар куҷо Соли >= 2000 ВА Соли <= 2008 ГУРӮҲ АЗ РУИ РӮЗҲАФФА ТАРТИБ АЗ РУИ c DESC;

Q2
ИНТИХОБ КАРДАНИ DayOfWeek, шумор (*) AS c АЗ сари вақт КУҶО DepDelay>10 ВА Соли >= 2000 ВА Соли <= 2008 ГУРӮҲ АЗ РУИ Рӯзи Ҳафта ТАРТИБ АЗ C DESC;

Q3
ИНТИХОБ КАРДАНИ пайдоиш, ҳисоб кунед(*) AS c АЗ сари вақт ДАР КУҶО DepDelay>10 ВА Соли >= 2000 ВА Соли <= 2008 ГУРУХ АЗ РУИ пайдоиш ТАРТИБ АЗ C DESC LIMIT 10;

Q4
Интихоби интиқолдиҳанда, ҳисоб () АЗ сари вақт КУҶО DepDelay>10 ВА Соли = 2007 ГУРӮҲ АЗ РУИ ОСИЁТ АЗ РУИ шумора() DESC;

Q5
ИНТИХОБ КУНЕД a.Carrier, c, c2, c1000/c2 ҳамчун c3 АЗ (Интихоби интиқолдиҳанда, ҳисоб () AS c АЗ саривақт КУҶО DepDelay>10 ВА Соли=2007 ГУРӮҲИ АЗ БАРОИ НАСЛИБЕР ) a ДОХИЛИИ ДОХИЛӢ (Интихоби интиқолдиҳанда,ҳисоб кунед(*) ҲАМЧУН c2 АЗ сари вақт КУҶО Сол=2007 ГУРӮҲИ НИШОНдиҳанда)b оид ​​ба a.Carrier=b.Карриер BY c3 DESC;

Q6
ИНТИХОБ КУНЕД a.Carrier, c, c2, c1000/c2 ҳамчун c3 АЗ (Интихоби интиқолдиҳанда, ҳисоб () AS c АЗ сари вақт КУҶО DepDelay>10 ВА Соли >= 2000 ВА Соли <= 2008 ГУРӮҲИ АЗ БАРОИ интиқолдиҳанда) як ҲАМРОҲИИ ДОХИЛӢ (Интихоби интиқолдиҳанда, ҳисоб(*) ҲАМЧУН c2 АЗ вақти саривақтӣ КУҶО Соли >= 2000 ВА Соли <= 2008 GROUP Интиқолдиҳанда ) b дар a.Carrier=b.Carrier ТАРТИБ АЗ c3 DESC;

Q7
Интиқоли интиқолдиҳанда, авг(DepDelay) * 1000 AS c3 АЗ вақти саривақтӣ КУҶО Сол >= 2000 ВА Соли <= 2008 ГУРӮҲИ АЗ БАРОИ интиқолдиҳанда;

Q8
Интихоби сол, миёна(DepDelay) АЗ сари вақт ГУРУХ БА СОЛ;

Q9
Солро интихоб кунед, (*) ҳамчун c1 аз гурӯҳи вақт аз рӯи сол ҳисоб кунед;

Q10
ИНТИХОБ AVg(cnt) АЗ (Сол,Моҳ,шумурда(*) ҲАМчун cnt АЗ вақти саривақтӣ ДАР КУҶО DepDel15=1 ГУРӮҲ АЗ СОЛ,Моҳ) a;

Q11
авг(c1)-ро аз (сол, моҳ, ҳисоб(*) ҳамчун c1 аз гурӯҳи саривақтӣ аз рӯи сол, моҳ интихоб кунед) a;

Q12
ИНТИХОБ OriginCityName, DestCityName, ҳисоб (*) AS c АЗ ГУРӮҲИ саривақтӣ АЗ РУИ OriginCityName, DestCityName ТАРТИБ АЗ C DESC LIMIT 10;

Q13
ИНТИХОБ OriginCityName, шумор (*) AS c АЗ ГУРУХИ саривақтӣ АЗ РУИ OriginCityName ТАРТИБ АЗ C DESC LIMIT 10;

Дархост дорои пайвастагиҳо мебошад

Q14
ИНТИХОБ a.Sil, c1/c2 АЗ (сол интихоб кунед, ҳисоб()1000 ҳамчун c1 аз сари вақт КУҶО DepDelay>10 ГУРӮҲ АЗ СОЛ) a ҲАМРОҲИИ ДОХИЛӢ (Сол интихоб кунед, ҳисоб(*) ҳамчун c2 аз вақт ГУРУХ БА СОЛ ) b дар a.Sol=b.Сол ТАРТИБ АЗ А.СОЛ;

Q15
ИНТИХОБ КУНЕД a."Sol", c1/c2 АЗ ( "Сол"-ро ​​интихоб кунед, ҳисоб кунед()1000 ҳамчун c1 АЗ fontime КУҶО "DepDelay">10 GROUP BOY "Year") a INNER JOIN ("Сол"-ро ​​интихоб кунед, ҳисоб кунед(*) ҳамчун c2 АЗ fontime GROUP BY "Sol" ) b дар a."Sol"=b. "Сол";

Ҷадвали-1: Дархостҳое, ки дар муқоиса истифода мешаванд

Иҷрои дархостҳо

Инҳоянд натиҷаҳои ҳар як дархост ҳангоми иҷро дар танзимоти гуногуни пойгоҳи додаҳо: PostgreSQL бо ва бе индекс, ClickHouse модарӣ ва clickhousedb_fdw. Вақт дар миллисонияҳо нишон дода мешавад.

Q#
PostgreSQL
PostgreSQL (Индексшуда)
кликхона
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: Вақт барои иҷрои дархостҳое, ки дар муқоиса истифода мешаванд

Натиҷаҳоро дидан

Графика вақти иҷрои дархостро бо миллисонияҳо, меҳвари X рақами дархостро аз ҷадвалҳои боло ва меҳвари Y вақти иҷроро бо миллисонияҳо нишон медиҳад. Натиҷаҳои ClickHouse ва маълумоте, ки аз postgres бо истифода аз clickhousedb_fdw гирифта шудаанд, нишон дода шудаанд. Аз ҷадвал шумо мебинед, ки байни PostgreSQL ва ClickHouse фарқияти калон вуҷуд дорад, аммо фарқияти ҳадди аққал байни ClickHouse ва clickhousedb_fdw.

Санҷиши иҷрои дархостҳои таҳлилӣ дар PostgreSQL, ClickHouse ва clickhousedb_fdw (PostgreSQL)

Ин график фарқияти байни ClickhouseDB ва clickhousedb_fdw-ро нишон медиҳад. Дар аксари дархостҳо, хароҷоти FDW он қадар баланд нест ва ба ҷуз аз Q12 аҳамиятнок нест. Ин дархост ҳамроҳшавӣ ва банди ORDER BY иборат аст. Аз сабаби банди ORDER BY GROUP/BY, ORDER BY ба ClickHouse намеафтад.

Дар ҷадвали 2 мо ҷаҳиши вақтро дар дархостҳои Q12 ва Q13 мебинем. Боз ҳам, ин аз сабаби банди ORDER BY аст. Барои тасдиқи ин, ман дархостҳои Q-14 ва Q-15-ро бо ва бидуни банди ORDER BY иҷро кардам. Бе банди ORDER BY вақти анҷом 259ms ва бо ORDER BY 1364212 аст.

Саволи 15: Бе фармоиш аз банди

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: Пурсиш бидуни фармоиши банди

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: Пурсиш бо фармони банди

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: Нақшаи пурсиш бо фармони банди

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)

хулоса

Натиҷаҳои ин таҷрибаҳо нишон медиҳанд, ки ClickHouse иҷрои воқеан хубро пешниҳод мекунад ва clickhousedb_fdw манфиатҳои иҷрои ClickHouse аз PostgreSQL-ро пешниҳод мекунад. Гарчанде ки ҳангоми истифодаи clickhousedb_fdw каме сарборӣ вуҷуд дорад, он ночиз аст ва бо иҷрои коре, ки тавассути кор дар базаи ClickHouse ба таври маҳаллӣ ба даст омадааст, қобили муқоиса аст. Ин инчунин тасдиқ мекунад, ки fdw дар PostgreSQL натиҷаҳои аъло медиҳад.

Чати Telegram тавассути Clickhouse https://t.me/clickhouse_ru
Чати Telegram бо истифода аз PostgreSQL https://t.me/pgsql

Манбаъ: will.com

Илова Эзоҳ