热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

PostgreSQLsharding:citus系列2TPCH

digoal德哥专栏PostgreSQLsharding:citu

作者

digoal


日期

2018-08-29


标签

PostgreSQL , citus , tpc-h




背景

紧接着上一篇文档,本文测试citus的tpc-h能力(包括兼容性).

《PostgreSQL sharding : citus 系列1 - 多机部署(含OLTP(TPC-B)测试)》

《(TPC-H测试 SF=10,SF=200) PostgreSQL 11 vs 10 vs Deepgreen》

https://github.com/digoal/gp_tpch

实际测试过程中,发现CITUS对TPC-H的SQL支持并不完整。


citus tpc-h 测试

1、下载gp_tpch包

git clone https://github.com/digoal/gp_tpch

2、生成200G测试数据

cd gp_tpch
ln -s `pwd` /tmp/dss-data
./dbgen -s 200

3、将数据转换为PG识别的格式

for i in `ls *.tbl`; do sed 's/|$//' $i > ${i/tbl/csv}; echo $i; done;

4、生成测试SQL

```

SF=200

mkdir dss/queries

for q in seq 1 22

do

DSS_QUERY=dss/templates ./qgen -s $SF $q > dss/queries/$q.sql

sed 's/^select/explain select/' dss/queries/$q.sql > dss/queries/$q.explain.sql

done

```

5、修改citus 的几个参数,确保在跑两类QUERY的时候不报错(末尾会提到报错原因)。

alter role postgres set citus.enable_repartition_joins =on;
alter role postgres set citus.max_intermediate_result_size =-1;

6、测试TPC-H(与coordinator同一台主机上测试)

./tpch.sh ./results 127.0.0.1 port tpch-db tpch-user password citus


tpc-h 性能

有些SQL不支持,显示0.

2018-08-29 19:24:30 [1535541870] : query 1 finished OK (12 seconds)
2018-08-29 19:24:30 [1535541870] : query 2 finished OK (0 seconds)
2018-08-29 19:25:48 [1535541948] : query 3 finished OK (77 seconds)
2018-08-29 19:25:50 [1535541950] : query 4 finished OK (2 seconds)
2018-08-29 19:29:45 [1535542185] : query 5 finished OK (234 seconds)
2018-08-29 19:29:47 [1535542187] : query 6 finished OK (1 seconds)
2018-08-29 19:37:33 [1535542653] : query 7 finished OK (465 seconds)
2018-08-29 19:44:30 [1535543070] : query 8 finished OK (415 seconds)
2018-08-29 19:58:29 [1535543909] : query 9 finished OK (837 seconds)
2018-08-29 20:00:26 [1535544026] : query 10 finished OK (116 seconds)
2018-08-29 20:00:26 [1535544026] : query 11 finished OK (0 seconds)
2018-08-29 20:00:32 [1535544032] : query 12 finished OK (6 seconds)
2018-08-29 20:00:33 [1535544033] : query 13 finished OK (0 seconds)
2018-08-29 20:01:40 [1535544100] : query 14 finished OK (67 seconds)
2018-08-29 20:05:33 [1535544333] : query 15 finished OK (232 seconds)
2018-08-29 20:05:34 [1535544334] : query 16 finished OK (0 seconds)
2018-08-29 20:05:34 [1535544334] : query 17 finished OK (0 seconds)
2018-08-29 20:05:34 [1535544334] : query 18 finished OK (0 seconds)
2018-08-29 20:06:51 [1535544411] : query 19 finished OK (76 seconds)
2018-08-29 20:06:51 [1535544411] : query 20 finished OK (0 seconds)
2018-08-29 20:06:52 [1535544412] : query 21 finished OK (0 seconds)
2018-08-29 20:06:52 [1535544412] : query 22 finished OK (0 seconds)
2018-08-29 20:06:52 [1535544412] : finished TPC-H benchmark


citus tpc-h SQL文件讲解

1、分片字段

select create_distributed_table('part','p_partkey');
select create_distributed_table('region','r_regionkey');
select create_distributed_table('nation','n_nationkey');
select create_distributed_table('supplier','s_suppkey');
select create_distributed_table('customer','c_custkey');
select create_distributed_table('partsupp','ps_suppkey');
select create_distributed_table('orders','o_orderkey');
select create_distributed_table('lineitem','l_orderkey');

2、colocate(默认情况下是同一个分组,不需要colocate)

```

SELECT mark_tables_colocated('part', ARRAY['region', 'nation', 'supplier', 'customer', 'partsupp', 'orders', 'lineitem']);

默认分组,在创建分片表时colocate默认为default,

只要表的shard数量、分片类型(append, or hash)、colocate组 都一致,则他们就是colocate的。

create_distributed_table

参数:colocate_with: (Optional) include current table in the co-location group of another table.
By default tables are co-located when they are distributed by columns of the same type,
have the same shard count, and have the same replication factor.
Possible values for colocate_with are default, none to start a new co-location group,
or the name of another table to co-locate with that table. (See Co-Locating Tables.)
```

3、索引

```

ALTER TABLE PART ADD constraint pk1 PRIMARY KEY (P_PARTKEY);

ALTER TABLE SUPPLIER ADD constraint pk2 PRIMARY KEY (S_SUPPKEY);

ALTER TABLE PARTSUPP ADD constraint pk3 PRIMARY KEY (PS_PARTKEY, PS_SUPPKEY);

ALTER TABLE CUSTOMER ADD constraint pk4 PRIMARY KEY (C_CUSTKEY);

ALTER TABLE ORDERS ADD constraint pk5 PRIMARY KEY (O_ORDERKEY);

ALTER TABLE LINEITEM ADD constraint pk6 PRIMARY KEY (L_ORDERKEY, L_LINENUMBER);

ALTER TABLE NATION ADD constraint pk7 PRIMARY KEY (N_NATIONKEY);

ALTER TABLE REGION ADD constraint pk8 PRIMARY KEY (R_REGIONKEY);

CREATE INDEX idx_nation_regionkey ON public.nation USING btree (n_regionkey);

CREATE INDEX idx6 ON public.nation USING btree (n_nationkey, n_regionkey);

CREATE INDEX idx5 ON public.region USING btree (r_name, r_regionkey);

CREATE INDEX IDX_CUSTOMER_NATIONKEY ON CUSTOMER (C_NATIONKEY);

CREATE INDEX IDX_LINEITEM_PART_SUPP ON LINEITEM (L_PARTKEY,L_SUPPKEY);

CREATE INDEX idx_lineitem_shipdate ON public.lineitem USING btree (l_shipdate, l_discount, l_quantity);

CREATE INDEX idx_lineitem__2 ON public.lineitem USING btree (l_partkey);

CREATE INDEX idx_lineitem__3 ON public.lineitem USING btree (l_suppkey);

CREATE INDEX idx_lineitem__11 ON public.lineitem USING btree (l_shipdate);

CREATE INDEX idx_lineitem_orderkey ON public.lineitem USING btree (l_orderkey);

CREATE INDEX idx1 ON public.lineitem USING btree (l_orderkey) WHERE (l_commitdate

CREATE INDEX idx_orders__6 ON public.orders USING btree (o_orderpriority);

CREATE INDEX idx_orders_orderdate ON public.orders USING btree (o_orderdate);

CREATE INDEX idx_orders_custkey ON public.orders USING btree (o_custkey)

CREATE INDEX idx_part__5 ON public.part USING btree (p_type);

CREATE INDEX idx_part__6 ON public.part USING btree (p_size);

CREATE INDEX idx_part_1 ON public.part USING btree (p_container, p_brand);

CREATE INDEX idx_supplier_nation_key ON public.supplier USING btree (s_nationkey);

CREATE INDEX idx4 ON public.supplier USING btree (s_suppkey, s_nationkey);

CREATE INDEX idx ON public.partsupp USING btree (ps_partkey, ps_suppkey, ps_supplycost);

CREATE INDEX idx_partsupp_partkey ON public.partsupp USING btree (ps_partkey);

CREATE INDEX idx_partsupp_suppkey ON public.partsupp USING btree (ps_suppkey);

CREATE INDEX idx_partsupp__4 ON public.partsupp USING btree (ps_supplycost);

```


citus测试TPC-H遇到的兼容性报错与解决方法


错误1

ERROR: could not run distributed query with subquery outside the FROM and WHERE clauses
HINT: Consider using an equality filter on the distributed table's partition column.

报错SQL

select
ps_partkey,
sum(ps_supplycost * ps_availqty) as value
from
partsupp,
supplier,
nation
where
ps_suppkey = s_suppkey
and s_natiOnkey= n_nationkey
and n_name = 'SAUDI ARABIA'
group by
ps_partkey having
sum(ps_supplycost * ps_availqty) > (
select
sum(ps_supplycost * ps_availqty) * 0.0000005000
from
partsupp,
supplier,
nation
where
ps_suppkey = s_suppkey
and s_natiOnkey= n_nationkey
and n_name = 'SAUDI ARABIA'
)
order by
value desc
LIMIT 1;

改成

```

select

ps_partkey,

sum(ps_supplycost * ps_availqty) as value

from

partsupp,

supplier,

nation

where

ps_suppkey = s_suppkey

and s_natiOnkey= n_nationkey

and n_name = 'SAUDI ARABIA'

group by

ps_partkey having

sum(ps_supplycost * ps_availqty) >

( sum(ps_supplycost * ps_availqty) filter

(where

ps_suppkey = s_suppkey

and s_natiOnkey= n_nationkey

and n_name = 'SAUDI ARABIA'

)

) * 0.0000005000

order by

value desc

LIMIT 1;

```


错误2

ERROR: the query contains a join that requires repartitioning
HINT: Set citus.enable_repartition_joins to on to enable repartitioning

报错SQL

select
l_orderkey,
sum(l_extendedprice * (1 - l_discount)) as revenue,
o_orderdate,
o_shippriority
from
customer,
orders,
lineitem
where
c_mktsegment = 'AUTOMOBILE'
and c_custkey = o_custkey
and l_orderkey = o_orderkey
and o_orderdate and l_shipdate > date '1995-03-08'
group by
l_orderkey,
o_orderdate,
o_shippriority
order by
revenue desc,
o_orderdate
LIMIT 10;

有些SQL需要repartition join,需要设置如下参数

alter role postgres set citus.enable_repartition_joins =on;


错误3

ERROR: the intermediate result size exceeds citus.max_intermediate_result_size (currently 1048576 kB)
DETAIL: Citus restricts the size of intermediate results of complex subqueries and CTEs to avoid accidentally pulling large result sets into once place.
HINT: To run the current query, set citus.max_intermediate_result_size to a higher value or -1 to disable.

有些SQL的中间结果比较大,可以设置为无限制,重新测试

alter role postgres set citus.max_intermediate_result_size =-1;


错误4

ERROR: 0A000: complex joins are only supported when all distributed tables are joined on their distribution columns with equal operator

复杂JOIN,仅支持分布键作为JOIN的字段,并且只能使用等值JOIN。

```

postgres=# explain select

sum(l_extendedprice) / 7.0 as avg_yearly

from

lineitem join

part on (p_partkey = l_partkey and p_brand = 'Brand#13' and p_cOntainer= 'SM PKG') join

(SELECT l_partkey AS agg_partkey, 0.2 * avg(l_quantity) AS avg_quantity FROM lineitem GROUP BY l_partkey) part_agg

on (agg_partkey = l_partkey) limit 10;

ERROR: 0A000: complex joins are only supported when all distributed tables are joined on their distribution columns with equal operator

LOCATION: DeferErrorIfUnsupportedSubqueryPushdown, query_pushdown_planning.c:469

```

对应的代码如下

https://github.com/citusdata/citus/blob/d63cbf382288358533b71d907f6a3a7fc8a1df5f/src/backend/distributed/planner/query_pushdown_planning.c

else if (!RestrictionEquivalenceForPartitionKeys(plannerRestrictionContext))
{
return DeferredError(ERRCODE_FEATURE_NOT_SUPPORTED,
"complex joins are only supported when all distributed tables are "
"joined on their distribution columns with equal operator",
NULL, NULL);
}


错误5

ERROR: failed to execute task 18

报错SQL

```

select

ps_partkey,

sum(ps_supplycost * ps_availqty) as value

from

partsupp,

supplier,

nation

where

ps_suppkey = s_suppkey

and s_natiOnkey= n_nationkey

and n_name = 'SAUDI ARABIA'

group by

ps_partkey having

sum(ps_supplycost * ps_availqty) > ( sum(ps_supplycost * ps_availqty) filter (where

ps_suppkey = s_suppkey

and s_natiOnkey= n_nationkey

and n_name = 'SAUDI ARABIA') ) * 0.0000005000

order by

value desc

LIMIT 1;

```


错误6

ERROR: 0A000: cannot run outer join query if join is not on the partition column
DETAIL: Outer joins requiring repartitioning are not supported.
LOCATION: FixedJoinOrderList, multi_join_order.c:189

报错SQL

select
c_count,
count(*) as custdist
from
(
select
c_custkey,
count(o_orderkey)
from
customer left outer join orders on
c_custkey = o_custkey
and o_comment not like '%unusual%requests%'
group by
c_custkey
) as c_orders (c_custkey, c_count)
group by
c_count
order by
custdist desc,
c_count desc
LIMIT 1;


小结

citus的复杂SQL的语法支持还不是非常完备,如果要实现比较复杂的运算,建议Writing in SQL, thinking in MapReduce

https://www.citusdata.com/blog/2018/08/17/breaking-down-citus-real-time-executor/

这样的话,基本上你可以避免掉复杂的SQL,使用分解动作来实现。

citus也有专门的tpch测试软件

https://github.com/dimitri/tpch-citus


PostgreSQL 许愿链接

您的愿望将传达给PG kernel hacker、数据库厂商等, 帮助提高数据库产品质量和功能, 说不定下一个PG版本就有您提出的功能点. 针对非常好的提议,奖励限量版PG文化衫、纪念品、贴纸、PG热门书籍等,奖品丰富,快来许愿。开不开森.


9.9元购买3个月阿里云RDS PostgreSQL实例


PostgreSQL 解决方案集合


德哥 / digoal's github - 公益是一辈子的事.

digoal's wechat


推荐阅读
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 推荐系统遇上深度学习(十七)详解推荐系统中的常用评测指标
    原创:石晓文小小挖掘机2018-06-18笔者是一个痴迷于挖掘数据中的价值的学习人,希望在平日的工作学习中,挖掘数据的价值, ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • 使用在线工具jsonschema2pojo根据json生成java对象
    本文介绍了使用在线工具jsonschema2pojo根据json生成java对象的方法。通过该工具,用户只需将json字符串复制到输入框中,即可自动将其转换成java对象。该工具还能解析列表式的json数据,并将嵌套在内层的对象也解析出来。本文以请求github的api为例,展示了使用该工具的步骤和效果。 ... [详细]
  • 关于我们EMQ是一家全球领先的开源物联网基础设施软件供应商,服务新产业周期的IoT&5G、边缘计算与云计算市场,交付全球领先的开源物联网消息服务器和流处理数据 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
author-avatar
易_拉罐
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有