译者: 李红艳,吴伟略
作者简介
Ibrar Ahmed,在Percona做高级软件工程师和PostgreSQL顾问,同时也是PostgreSQL全球开发组的开发人员。这是一篇介绍Clickhouse FDW的文章。原文名称为《PostgreSQL: Access ClickHouse, One of the Fastest Column DBMSs, With clickhousedb_fdw》。
李红艳,杭州衡数软件技术负责人,有百货公司(超过40家)、视光集团和知名电商新零售大数据分析经验。
吴伟略,深圳市中电电力技术股份有限公司后端开发工程师,曾参与公司高性能文件缓存开发和移动端开发,现负责公司软件平台的开发和架构设计。
为ClickHouse准备数据
现在数据在ClickHouse中准备就绪,下一步是设置PostgreSQL。我们需要创建一个ClickHouse外部服务器,用户映射和外部表。
安装clickhousedb_fdw扩展
虽然可以手动方式安装clickhousedb_fdw,但clickhousedb_fdw可以使用PostgreSQL最酷的扩展安装功能。只需输入SQL命令即可使用扩展,
CREATE EXTENSION clickhousedb_fdw;
创建服务器
CREATE SERVER clickhouse_svr FOREIGN DATA WRAPPER clickhousedb_fdw OPTIONS (dbname 'test_database', driver '/use/lib/libclickhouseodbc.so');
创建用户映射
CREATE USER MAPPING FOR CURRENT_USER SERVER clickhouse_svr;
创建外表
CREATE FOREIGN TABLE clickhouse_tbl_ontime ( "Year" Int, "Quarter" Int8, "Month" Int8, "DayofMonth" Int8, "DayOfWeek" Int8, "FlightDate" Date, "UniqueCarrier" Varchar(7), "AirlineID" Int, "Carrier" Varchar(2), "TailNum" text, "FlightNum" text, "OriginAirportID" Int, "OriginAirportSeqID" Int, "OriginCityMarketID" Int, "Origin" Varchar(5), "OriginCityName" text, "OriginState" Varchar(2), "OriginStateFips" text, "OriginStateName" text, "OriginWac" Int, "DestAirportID" Int, "DestAirportSeqID" Int, "DestCityMarketID" Int, "Dest" Varchar(5), "DestCityName" text, "DestState" Varchar(2), "DestStateFips" text, "DestStateName" text, "DestWac" Int, "CRSDepTime" Int, "DepTime" Int, "DepDelay" Int, "DepDelayMinutes" Int, "DepDel15" Int, "DepartureDelayGroups" text, "DepTimeBlk" text, "TaxiOut" Int, "WheelsOff" Int, "WheelsOn" Int, "TaxiIn" Int, "CRSArrTime" Int, "ArrTime" Int, "ArrDelay" Int, "ArrDelayMinutes" Int, "ArrDel15" Int, "ArrivalDelayGroups" Int, "ArrTimeBlk" text, "Cancelled" Int8, "CancellationCode" Varchar(1), "Diverted" Int8, "CRSElapsedTime" Int, "ActualElapsedTime" Int, "AirTime" Int, "Flights" Int, "Distance" Int, "DistanceGroup" Int8, "CarrierDelay" Int, "WeatherDelay" Int, "NASDelay" Int, "SecurityDelay" Int, "LateAircraftDelay"
Int, "FirstDepTime" text, "TotalAddGTime" text, "LongestAddGTime" text, "DivAirportLandings" text, "DivReachedDest" text, "DivActualElapsedTime" text, "DivArrDelay" text, "DivDistance" text, "Div1Airport" text, "Div1AirportID" Int, "Div1AirportSeqID" Int, "Div1WheelsOn" text, "Div1TotalGTime" text, "Div1LongestGTime" text, "Div1WheelsOff" text, "Div1TailNum" text, "Div2Airport" text, "Div2AirportID" Int, "Div2AirportSeqID" Int, "Div2WheelsOn" text, "Div2TotalGTime" text, "Div2LongestGTime" text,"Div2WheelsOff" text, "Div2TailNum" text, "Div3Airport" text, "Div3AirportID" Int, "Div3AirportSeqID" Int, "Div3WheelsOn" text, "Div3TotalGTime" text, "Div3LongestGTime" text, "Div3WheelsOff" text, "Div3TailNum" text, "Div4Airport" text, "Div4AirportID" Int, "Div4AirportSeqID" Int, "Div4WheelsOn" text, "Div4TotalGTime" text, "Div4LongestGTime" text, "Div4WheelsOff" text, "Div4TailNum" text, "Div5Airport" text, "Div5AirportID" Int, "Div5AirportSeqID" Int, "Div5WheelsOn" text, "Div5TotalGTime" text, "Div5LongestGTime" text, "Div5WheelsOff" text, "Div5TailNum" text) server clickhouse_svr options(table_name 'ontime');
查询样例
postgres=# SELECT a."Year", c1/c2 as Value FROM ( select "Year", count(*)*1000 as c1FROM clickhouse_tbl_ontimeWHERE "DepDelay">10 GROUP BY "Year") aINNER JOIN (select "Year", count(*) as c2 from clickhouse_tbl_ontimeGROUP BY "Year" ) b on a."Year"=b."Year" LIMIT 3;Year | value------+------------1987 | 1991988 | 52020960001989 | 5041199000(3 rows)
性能特性
PostgreSQL通过添加下推功能改进了外部数据封装器处理。由于数据处理在处理链中较早发生,因此下推可显着提高性能。下推能力包括:
· 算子和函数下推
· 谓词下推
· 聚合下推
· Join下推
算子和函数下推
函数和算子发送到Clickhouse而不是在PostgreSQL端计算和过滤。
postgres=# EXPLAIN VERBOSE SELECT avg("DepDelay") FROM clickhouse_tbl_ontime WHERE "DepDelay" <10;Foreign Scan (cost=1.00..-1.00 rows=1000 width=32) Output: (avg("DepDelay"))Relations: Aggregate on (clickhouse_tbl_ontime)Remote SQL: SELECT avg("DepDelay") FROM "default".ontime WHERE (("DepDelay" < 10))(4 rows)
谓词下推
clickhousedb_fdw不会在PostgreSQL端过滤的数据,而是将谓词发送给Clikhouse数据库。
postgres=# EXPLAIN VERBOSE SELECT "Year" FROM clickhouse_tbl_ontime WHERE "Year"=1989;Foreign Scan on public.clickhouse_tbl_ontime Output: "Year"Remote SQL: SELECT "Year" FROM "default".ontime WHERE (("Year" = 1989)
聚合下推
聚合下推是PostgreSQL FDW的一项新功能。目前很少有外部数据封装器支持聚合下推 - clickhousedb_fdw就是其中之一。规划器决定哪些聚合被下推,哪些聚合不下推。以下是两种情况的示例,
postgres=# EXPLAIN VERBOSE SELECT count(*) FROM clickhouse_tbl_ontime;Foreign Scan (cost=1.00..-1.00 rows=1000 width=8)Output: (count(*)) Relations: Aggregate on (clickhouse_tbl_ontime)Remote SQL: SELECT count(*) FROM "default".ontime
Join下推
同样,这也是PostgreSQL FDW中的一个新功能,我们的clickhousedb_fdw也支持join 下推。例子如下
postgres=# EXPLAIN VERBOSE SELECT a."Year"FROM clickhouse_tbl_ontime aLEFT JOIN clickhouse_tbl_ontime b ON a."Year" = b."Year";Foreign Scan (cost=1.00..-1.00 rows=1000 width=50);Output: a."Year" Relations: (clickhouse_tbl_ontime a) LEFT JOIN (clickhouse_tbl_ontime b)Remote SQL: SELECT r1."Year" FROM "default".ontime r1 ALL LEFT JOIN "default".ontime r2 ON (((r1."Year" = r2."Year")))
Percona's对PostgreSQL的支持
作为我们致力于成为开源数据库生态系统的公正支持者的一部分承诺,Percona为PostgreSQL提供支持 - 你可以在这里阅读更多相关内容。 正如您所看到的,作为我们支持承诺的一部分,我们现在正在开发自己的开源PostgreSQL项目,例如clickhousedb_fdw。欢迎订阅博客,第一时间从Percona’s了解了解PostgreSQL和其他开源项目。
作为新clickhousdb_fdw和其他FDW的作者 - 我会很高兴听到您的使用案例和使用此功能的经验。
请点击文章底部“阅读原文”查看原文内容。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69917105/viewspace-3149912/ ,如需转载,请注明出处,否则将追究法律责任。