PostgreSQL, ClickHouse සහ clickhousedb_fdw (PostgreSQL) හි විශ්ලේෂණාත්මක විමසුම්වල කාර්ය සාධනය පරීක්ෂා කිරීම

මෙම අධ්‍යයනයේදී, PostgreSQL වෙනුවට ClickHouse දත්ත මූලාශ්‍රයක් භාවිතා කිරීමෙන් ලබා ගත හැකි කාර්ය සාධන වැඩිදියුණු කිරීම් මොනවාදැයි බැලීමට මට අවශ්‍ය විය. ClickHouse භාවිතා කිරීමෙන් මට ලැබෙන ඵලදායිතා ප්‍රතිලාභ මම දනිමි. මම විදේශ දත්ත දවටනයක් (FDW) භාවිතයෙන් PostgreSQL වෙතින් ClickHouse වෙත පිවිසෙන්නේ නම් මෙම ප්‍රතිලාභ දිගටම පවතිනු ඇත්ද?

අධ්‍යයනය කරන ලද දත්ත සමුදා පරිසරයන් වන්නේ PostgreSQL v11, clickhousedb_fdw සහ ClickHouse දත්ත සමුදායයි. අවසාන වශයෙන්, PostgreSQL v11 වෙතින් අපි අපගේ clickhousedb_fdw හරහා ClickHouse දත්ත ගබඩාව වෙත විවිධ SQL විමසුම් ධාවනය කරනු ඇත. FDW හි ක්‍රියාකාරිත්වය ස්වදේශික PostgreSQL සහ ස්වදේශික ClickHouse හි ධාවනය වන එකම විමසුම් සමඟ සැසඳෙන්නේ කෙසේදැයි අපි පසුව බලමු.

ක්ලික්හවුස් දත්ත සමුදාය

ClickHouse යනු සාම්ප්‍රදායික දත්ත සමුදා ප්‍රවේශයන්ට වඩා 100-1000 ගුණයකින් වේගවත් කාර්ය සාධනයක් ලබා ගත හැකි විවෘත මූලාශ්‍ර තීරු දත්ත සමුදා කළමනාකරණ පද්ධතියකි, තත්පරයකට අඩු කාලයකදී පේළි බිලියනයකට වඩා වැඩි ප්‍රමාණයක් සැකසීමට හැකියාව ඇත.

Clickhousedb_fdw

clickhousedb_fdw - ClickHouse දත්ත ගබඩාව හෝ FDW සඳහා බාහිර දත්ත දවටනය Percona වෙතින් විවෘත මූලාශ්‍ර ව්‍යාපෘතියකි. ව්‍යාපෘතියේ GitHub ගබඩාවට සබැඳියක් මෙන්න.

මාර්තු මාසයේදී මම අපගේ FDW ගැන වැඩි විස්තර පවසන බ්ලොග් අඩවියක් ලිව්වෙමි.

ඔබට පෙනෙන පරිදි, මෙය ClickHouse සඳහා FDW සපයන අතර එය PostgreSQL v11 සේවාදායකයෙන් ClickHouse දත්ත ගබඩාවෙන් SELECT කිරීමට සහ ඇතුල් කිරීමට ඉඩ සලසයි.

FDW එකතු කිරීම සහ එකතු වීම වැනි උසස් විශේෂාංග සඳහා සහය දක්වයි. මෙම සම්පත්-දැඩි මෙහෙයුම් සඳහා දුරස්ථ සේවාදායකයේ සම්පත් භාවිතා කිරීමෙන් මෙය කාර්ය සාධනය සැලකිය යුතු ලෙස වැඩි දියුණු කරයි.

මිණුම් ලකුණ පරිසරය

  • Supermicro සේවාදායකය:
    • Intel® Xeon® CPU E5-2683 v3 @ 2.00GHz
    • සොකට් 2 / හරය 28 / නූල් 56
    • මතකය: 256GB RAM
    • ගබඩාව: Samsung SM863 1.9TB Enterprise SSD
    • ගොනු පද්ධතිය: ext4/xfs
  • OS: Linux smblade01 4.15.0-42-generic #45~16.04.1-Ubuntu
  • PostgreSQL: අනුවාදය 11

මිණුම් සලකුණු පරීක්ෂණ

මෙම පරීක්ෂණය සඳහා යන්ත්‍ර-උත්පාදිත දත්ත කට්ටල කිහිපයක් භාවිතා කරනවා වෙනුවට, අපි 1987 සිට 2018 දක්වා "කාල වාර්තා කළ ක්‍රියාකරු කාලය අනුව ඵලදායිතාව" දත්ත භාවිතා කළෙමු. ඔබට දත්ත වෙත ප්රවේශ විය හැක මෙහි ඇති අපගේ ස්ක්‍රිප්ට් භාවිතයෙන්.

දත්ත සමුදායේ ප්‍රමාණය 85 GB වන අතර තීරු 109 කින් යුත් එක් වගුවක් සපයයි.

මිණුම් සලකුණු විමසුම්

ClickHouse, clickhousedb_fdw සහ PostgreSQL සංසන්දනය කිරීමට මා භාවිතා කළ විමසුම් මෙන්න.

Q#
විමසුමේ සමස්ථයන් සහ කණ්ඩායම් විසින් අඩංගු වේ

Q1
DayOfWeek තෝරන්න, c DESC මගින් ගණන් කරන්න (*) c වර්‍ෂය >= 2000 සහ වසර <= 2008 GROUP by DayOfweek Order by c DESC;

Q2
DayOfWeek තෝරන්න, DepDelay>10 සහ වසර >= 2000 සහ වසර <= 2008 <= XNUMX GROUP by DayOfweek අනුව c DESC අනුව නියමිත වේලාවේ සිට c ලෙස ගණන් කරන්න;

Q3
මූලාරම්භය තෝරන්න, නියමිත වේලාවේ සිට ගණන් (*) ලෙස ගණන් කරන්න DepDelay>10 සහ වසර >= 2000 සහ වසර <= 2008 කණ්ඩායම ආරම්භය අනුව ඇණවුම DESC සීමාව 10;

Q4
වාහකය තෝරන්න, ගණන් කරන්න() නියමිත වේලාවේ සිට DepDelay>10 සහ වසර = 2007 කණ්ඩායම අනුව වාහක ඇණවුම ගණන් අනුව () DESC;

Q5
SELECT a.Carrier, c, c2, c1000/c2 c3 ලෙස (වාහකය තෝරන්න, ගණන් කරන්න() නියමිත වේලාවේ සිට AS ලෙස DepDelay>10 සහ වසර=2007 කණ්ඩායම වාහකයා විසින් කණ්ඩායමක්) අභ්‍යන්තර එකතුවක් (වාහකය තෝරන්න,ගණනය(*) c2 ලෙස c2007 නියමිත වේලාවෙන් කොතැනද වර්ෂය=3 වාහකයා විසින් කණ්ඩායම)b මත a.Carrier=b.Carrier ORDER CXNUMX DESC මගින්;

Q6
SELECT a.Carrier, c, c2, c1000/c2 c3 ලෙස (වාහකය තෝරන්න, ගණන් කරන්න() නියමිත වේලාවට අනුව DepDelay>10 සහ වසර >= 2000 සහ වසර <= 2008 වාහකයා විසින් කණ්ඩායම) අභ්‍යන්තර එකතුවක් (වාහකයා තෝරන්න, ගණන් කරන්න(*) c2 ලෙස නියමිත වේලාවෙන් කොතැනද වර්ෂය >= 2000 සහ වසර <= 2008 වාහකය ) b මත a.Carrier=b.C3 DESC මගින් වාහක ඇණවුම;

Q7
වාහකය තෝරන්න, සාමාන්‍යය (DepDelay) * 1000 AS c3 නියමිත වේලාවෙන් කොහිද වර්ෂය >= 2000 සහ වසර <= 2008 වාහකයා විසින් කණ්ඩායම;

Q8
වසර, සාමාන්‍යය (DepDelay) නියමිත කාලයෙන් වසරින් කණ්ඩායම තෝරන්න;

Q9
වර්ෂය තෝරන්න, වර්ෂය අනුව නියමිත වේලාවට කණ්ඩායමෙන් c1 ලෙස ගණන් කරන්න (*);

Q10
සාමාන්‍ය (cnt) සිට තෝරන්න (වර්ෂය, මාසය, ගණන (*) නියමිත වේලාවෙන් තෝරන්න

Q11
සිට avg(c1) තෝරන්න (වර්ෂය,මාසය,ගණනය(*) c1 ලෙස ඔන්ටයිම් කාණ්ඩයෙන් වර්ෂය,මාසය අනුව තෝරන්න) a;

Q12
OriginCityName, DestCityName තෝරන්න, ගණන් (*) ලෙස c ontime GROUP වෙතින් OriginCityName, DestCityName ඇණවුම c DESC LIMIT 10 අනුව;

Q13
OriginCityName තෝරන්න, ගණන් (*) ලෙස c ontime GROUP by OriginCityName අනුව ඇණවුම DESC LIMIT 10;

විමසුමට සම්බන්ධ කිරීම් අඩංගු වේ

Q14
අ.වසර, c1/c2 තෝරන්න (වසර තෝරන්න, ගණන් කරන්න()1000 c1 ලෙස c10 ලෙස DHERE DepDelay>වසරෙන් කණ්ඩායම් 2) අභ්‍යන්තර එකතුවක් (වසරක් තෝරන්න, වසරින් නියමිත කාලයෙන් cXNUMX ලෙස ගණන් කරන්න (*) වසරින් වසර ) b මත a.Year=b.අවුරුද්දෙන් ඇණවුම;

Q15
අ.”වසර”, c1/c2 තෝරන්න (“වසර” තෝරන්න, ගණන් කරන්න ()1000 c1 ලෙස "DepDelay"> "වසර" අනුව 10 කණ්ඩායම) අභ්‍යන්තර එකතුවක් ("වසර" තෝරන්න, c2 ලෙස ගණන් කරන්න (*) ෆොන්ටයිම් කණ්ඩායමෙන් "වසර" ) b on a."year"=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 අක්ෂය මඟින් ක්‍රියාත්මක වන කාලය මිලි තත්පර වලින් ද පෙන්වයි. Clickhousedb_fdw භාවිතයෙන් postgres වෙතින් ලබාගත් ClickHouse ප්‍රතිඵල සහ දත්ත පෙන්වා ඇත. PostgreSQL සහ ClickHouse අතර විශාල වෙනසක් ඇති නමුත් ClickHouse සහ clickhousedb_fdw අතර අවම වෙනසක් ඇති බව වගුවෙන් ඔබට පෙනෙනු ඇත.

PostgreSQL, ClickHouse සහ clickhousedb_fdw (PostgreSQL) හි විශ්ලේෂණාත්මක විමසුම්වල කාර්ය සාධනය පරීක්ෂා කිරීම

මෙම ප්‍රස්ථාරය ClickhouseDB සහ clickhousedb_fdw අතර වෙනස පෙන්වයි. බොහෝ විමසුම් වලදී, FDW උඩිස් පිරිවැය එතරම් ඉහළ මට්ටමක නොමැති අතර Q12 හැරෙන්නට කිසිසේත්ම වැදගත් නොවේ. මෙම විමසුමට සම්බන්ධ කිරීම් සහ වගන්තියෙන් නියෝගයක් ඇතුළත් වේ. Order by GROUP/BY වගන්තිය නිසා, ORDER BY ClickHouse වෙත පහළට වැටෙන්නේ නැත.

වගුව 2 හි Q12 සහ Q13 විමසුම්වල කාල පැනීම අපි දකිමු. නැවතත්, මෙය සිදු වන්නේ ORDER BY වගන්තිය මගිනි. මෙය තහවුරු කිරීම සඳහා, මම Q-14 සහ Q-15 යන වගන්තිය අනුව නියෝගයක් සහිතව සහ රහිතව විමසුම් ක්‍රියාත්මක කළෙමි. ORDER BY වගන්තිය නොමැතිව සම්පූර්ණ කිරීමේ කාලය 259ms වන අතර ORDER BY වගන්තිය සමඟ එය 1364212 වේ. මෙම විමසුම නිදොස් කිරීම සඳහා මම විමසුම් දෙකම පැහැදිලි කරන අතර පැහැදිලි කිරීමේ ප්‍රතිඵල මෙහි දැක්වේ.

Q15: වගන්තිය අනුව නියෝගයක් නොමැතිව

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: වගන්තියෙන් නියෝගයකින් තොරව විමසන්න

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)

Q14: වගන්තිය අනුව ඇණවුම සහිත විමසුම

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: වගන්තිය අනුව ඇණවුම සමඟ විමසුම් සැලැස්ම

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 PostgreSQL වෙතින් ClickHouse හි කාර්ය සාධන ප්‍රතිලාභ ලබා දෙයි. clickhousedb_fdw භාවිතා කරන විට යම් පොදු කාර්යක් ඇතත්, එය ClickHouse දත්ත සමුදාය මත ස්වදේශීයව ධාවනය කිරීමෙන් ලබා ගන්නා කාර්ය සාධනය නොසැලකිය හැකි අතර සැසඳිය හැක. PostgreSQL හි fdw විශිෂ්ට ප්‍රතිඵල ලබා දෙන බව මින් ද තහවුරු වේ.

Clickhouse හරහා Telegram කතාබස් කරන්න https://t.me/clickhouse_ru
PostgreSQL භාවිතයෙන් ටෙලිග්‍රාම් කතාබස් https://t.me/pgsql

මූලාශ්රය: www.habr.com

අදහස් එක් කරන්න