Tpc-h测试greenplum性能

简介: Tpc-h测试greenplum性能

Tpc-h测试greenplum性能

集群环境

主机名

ip

内存

磁盘

Node1

192.168.71.11

2G

80G

Node2

192.168.71.12

1.5G

80G

Node3

192.168.71.13

1.5G

80G

 

首先一点忠告:tpch不要到官网下,下不下来

建议到csdn下载:tpch-dbgen.tar.gz

然后TPCH是什么?

TPC-H包括8张表(表上有些约束等需要满足,参见TPC-H规范,不再罗列),如下:
PART:表示零件的信息
SUPPLIER:表示供货商的信息
PARTSUPP:表示供货商的零件的信息
CUSTOMER:表示消费者的信息
ORDERS:表示订单的信息
LINEITEM:表示在线商品的信息
NATION:表示国家的信息
REGION:表示地区的信息
这8张表之间的关系,如图所示

 

1.     安装tpch并生成10G测试数据

Tar -zxvf tpch-dbgen.tar.gz

解压玩安装包之后,会多出一个dbgen文件夹,执行cd dbgen到degen目录下

cp makefile.sute Makefile

vim Makefile

修改如下:

CC = gcc

DATABASE= ORACLE
MACHINE = LINUX
WORKLOAD = TPCH

然后执行make,生成tpch的仿真数据,dbgen下面会多了8个表名命名的.tbl文件

注意:有的安装包如果发现包含makefile文件的内容已修改,可直接make,按上面的操作反而会报错。

 

执行下面的命令生成10G仿真数据: ./dbgen -s 10 -f(依照机器性能的不同所需时间不同,大概几分钟)

 

然后将测试数据转化为GP能够识别的格式,删除末尾的分隔符|。

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

 

2.     下载pg_tpch并关联tpch

wget https://github.com/tvondra/pg_tpch/archive/master.zip

解压安装

在他的dss目录下面有加载tpch数据到gp的脚本

其中tpch-load.sql是列式存储,tpch-load_pg.sql是行存储,具体的优化熟悉gp用法之后自行修改优化。其他几个脚本是创建表的脚本。

 

将pg_tpch的文件逗拷贝到dbgen下面:

cp -r pg_tpch-master/*       /dbgen

 

创建一个queries目录,用于存放转换后的tpc-h 测试SQL。

mkdir dss/queries

 

生成测试SQL

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

3.     Load数据到GP

在greenplum数据库中创建数据库和用户(也可以不创建,只要有就可以)

 

配置pg_hba.conf

$ vi $MASTER_DATA_DIRECTORY/pg_hba.conf

host all all 127.0.0.1/32 trust

$ gpstop -u

设置几个参数:

gpconfig -c enable_nestloop -v off

gpconfig -c work_mem -v 256MB

gpstop -u

测试,使用digoal用户连接到postgres数据库,结果输出到./results目录:
自动创建表,加载数据。详见tpch.sh脚本

./tpch.sh ./results tpch-db tpch-user (机器性能不同所需时间不同,大概需要半小时)

结束后,可以使用以下方法生成CSV报告。

php process.php ./results output.csv

4.     基于mondrian-web测试gp性能

首先将tpch所有的表join到一张大表中(tpch_join),一个大sql来jion的话本机的gp太慢,分为几个小表分别join,最后再合到一起。见下图和sql。

 

create table oc_join as select o.* ,c .* from orders o left join customer c on o.o_custkey=c.c_custkey distributed by (o_orderkey)

 

create table nr_join as select n.* ,r.* from nation n left join region r on n.n_regionkey=r.r_regionkey distributed by (n_nationkey)

 

 

create table snr_join as select s.*,nr.* from supplier s left join nr_join nr on s.s_nationkey=nr.n_nationkey distributed by (s_suppkey)

 

create table pps_join as select ps.*,p.*,snr.* from partsupp ps left join part p on ps.ps_partkey=p.p_partkey left join snr_join snr on ps.ps_suppkey=snr.s_suppkey distributed by (ps_partkey,ps_suppkey)

 

列式存储

create table tpch_join  with (appendonly=true, compresstype=quicklz, compresslevel=1, orientation=column) as select lt.*,pps.*,oc.* from lineitem lt left join pps_join pps on lt.l_partkey=pps.ps_partkey and lt.l_suppkey=pps.ps_suppkey left join oc_join oc on lt.l_orderkey=oc.o_orderkey distributed by (l_linenumber,l_orderkey)

 

行式存储

create table tpch_join  with (appendonly=true, compresstype=quicklz, compresslevel=1) as select lt.*,pps.*,oc.* from lineitem lt left join pps_join pps on lt.l_partkey=pps.ps_partkey and lt.l_suppkey=pps.ps_suppkey left join oc_join oc on lt.l_orderkey=oc.o_orderkey distributed by (l_linenumber,l_orderkey)

 

查看表空间

select pg_size_pretty(pg_relation_size('tpch_join'));

select pg_size_pretty(pg_total_relation_size('tpch_join'));

select pg_size_pretty(pg_database_size('testtpch'));

 

创建主键和索引

alter table tpch_join add primary key(l_linenumber,l_orderkey);

create index indx_tpch_join_linenumber on tpch_join (l_linenumber);

create index indx_tpch_join_orderkey on tpch_join (l_orderkey);

create index indx_tpch_join_partkey on tpch_join (l_partkey);

create index indx_tpch_join_suppkey on tpch_join (l_suppkey);

 

注意:

       最后生成的tpch_join大表如果使用行式存储会有80几个G,加上主键和索引之后同时优化数据库配置,尽管最简单的查询速度回巨慢无比,所以后来改为列式存储。

数据库优化配置如下(配置完之后对查询效率的提升没有太大的效果,对mondrian查询提升只有十几秒,可能受限于我的虚拟机的资源的问题):

       编辑$MASTER_DATA_DIRECTORY/postgresql.conf

       shared_buffers:刚开始可以设置一个较小的值,比如总内存的15%,然后逐渐增加,过程中监控性能提升和swap的情况

       effective_cache_size : 这个参数告诉PostgreSQL的优化器有多少内存可以被用来缓存数据,以及帮助决定是否应该使用索引。这个数值越大,优化器使用索引的可能性也越大。 因此这个数值应该设置成shared_buffers加上可用操作系统缓存两者的总量。通常这个数值会超过系统内存总量的50%

       temp_buffers: 即临时缓冲区,拥有数据库访问临时数据,GP中默认值为1M,在访问比较到大的临时表时,对性能提升有很大帮助。

 

转用列式存储之后最后的大表是22G左右,能够支持mondrian对gp的操作,相应时间1-2分钟,但是遇到group by 后面的字段将全表数据全部扫出来的时候,集群内存会爆掉。

gp行列存储的查询性能对比

存储方式

Tpch_join大小

压缩方式

主键

索引

MDX

Mondrian生成查询语句

查询时间

行式

84G

L_linenumber,

l_orderkey

indx_tpch_join_linenumber,

indx_tpch_join_orderkey,

indx_tpch_join_partkey,

indx_tpch_join_suppkey

select{[Lineitem].[LineitemInfo].[l_linenumber].members} on columns,

[measures].[l_extendedprice] on rows

from [Lineitem]

Select "lineitem"."l_linenumber" as "c0", sum("lineitem"."l_extendedprice") as "m0" from "lineitem" as "lineitem" group by "c0"

 

----

行式

36G

quicklz

同上

同上

同上

同上

13min24s

列式

22G

quicklz

同上

同上

同上

同上

75s

 

所以使用gp和mondrian对于某个业务做多维分析的时候,join出来的大表首先一定要使用列式存储,在保证查询的前提下,再去根据自身集群的资源配置gp的数据库系统参数来提升查询性能。

相关文章
|
2月前
|
机器学习/深度学习 人工智能 监控
提升软件质量的关键路径:高效测试策略与实践在软件开发的宇宙中,每一行代码都如同星辰般璀璨,而将这些星辰编织成星系的过程,则依赖于严谨而高效的测试策略。本文将引领读者探索软件测试的奥秘,揭示如何通过精心设计的测试方案,不仅提升软件的性能与稳定性,还能加速产品上市的步伐,最终实现质量与效率的双重飞跃。
在软件工程的浩瀚星海中,测试不仅是发现缺陷的放大镜,更是保障软件质量的坚固防线。本文旨在探讨一种高效且创新的软件测试策略框架,它融合了传统方法的精髓与现代技术的突破,旨在为软件开发团队提供一套系统化、可执行性强的测试指引。我们将从测试规划的起点出发,沿着测试设计、执行、反馈再到持续优化的轨迹,逐步展开论述。每一步都强调实用性与前瞻性相结合,确保测试活动能够紧跟软件开发的步伐,及时适应变化,有效应对各种挑战。
|
3月前
|
测试技术 数据库 UED
Python 性能测试进阶之路:JMeter 与 Locust 的强强联合,解锁性能极限
【9月更文挑战第9天】在数字化时代,确保软件系统在高并发场景下的稳定性至关重要。Python 为此提供了丰富的性能测试工具,如 JMeter 和 Locust。JMeter 可模拟复杂请求场景,而 Locust 则能更灵活地模拟真实用户行为。结合两者优势,可全面评估系统性能并优化瓶颈。例如,在电商网站促销期间,通过 JMeter 模拟大量登录请求并用 Locust 模拟用户浏览和购物行为,可有效识别并解决性能问题,从而提升系统稳定性和用户体验。这种组合为性能测试开辟了新道路,助力应对复杂挑战。
114 2
|
2月前
|
监控 测试技术 PHP
性能和压力测试
【10月更文挑战第10天】性能和压力测试
114 60
|
3月前
|
缓存 Java 测试技术
谷粒商城笔记+踩坑(11)——性能压测和调优,JMeter压力测试+jvisualvm监控性能+资源动静分离+修改堆内存
使用JMeter对项目各个接口进行压力测试,并对前端进行动静分离优化,优化三级分类查询接口的性能
100 10
谷粒商城笔记+踩坑(11)——性能压测和调优,JMeter压力测试+jvisualvm监控性能+资源动静分离+修改堆内存
|
2月前
|
测试技术 PHP 开发工具
php性能监测模块XHProf安装与测试
【10月更文挑战第13天】php性能监测模块XHProf安装与测试
33 0
|
3月前
|
敏捷开发 安全 测试技术
软件测试的艺术:确保质量与性能的平衡之道
【9月更文挑战第24天】在软件开发的海洋中,测试是导航灯塔,指引着项目安全抵达质量的彼岸。本文将深入探讨软件测试的核心原则、方法论以及如何通过精心设计的测试策略来保障产品的可靠性和性能。我们将从测试的基础知识出发,逐步深入到高级测试技巧,最终展示如何通过实际案例来应用这些知识以确保软件的成功交付。
|
3月前
|
测试技术 Python
软件测试的艺术:确保质量与性能
【9月更文挑战第19天】在数字化时代,软件已成为我们生活的一部分。然而,随着软件复杂性的增加,如何确保其质量和性能成为了一个挑战。本文将探讨软件测试的重要性,介绍常见的测试类型和策略,并提供实用的代码示例来帮助读者更好地理解和应用这些测试方法。无论你是开发人员、测试工程师还是项目管理者,这篇文章都将为你提供有价值的见解和技巧。
|
3月前
|
存储 Java 关系型数据库
“代码界的魔法师:揭秘Micronaut框架下如何用测试驱动开发将简单图书管理系统变成性能怪兽!
【9月更文挑战第6天】Micronaut框架凭借其轻量级和高性能特性,在Java应用开发中备受青睐。本文通过一个图书管理系统的案例,介绍了在Micronaut下从单元测试到集成测试的全流程。首先,我们使用`@MicronautTest`注解编写了一个简单的`BookService`单元测试,验证添加图书功能;接着,通过集成测试验证了`BookService`与数据库的交互。整个过程展示了Micronaut强大的依赖注入和测试支持,使测试编写变得更加高效和简单。
77 4
|
4月前
|
消息中间件 Kafka 测试技术
【Azure 事件中心】使用Kafka的性能测试工具(kafka-producer-perf-test)测试生产者发送消息到Azure Event Hub的性能
【Azure 事件中心】使用Kafka的性能测试工具(kafka-producer-perf-test)测试生产者发送消息到Azure Event Hub的性能
|
4月前
|
存储 算法 Cloud Native
【PolarDB-X列存魔法】揭秘TPC-H测试背后的性能优化秘籍!
【8月更文挑战第25天】阿里巴巴的云原生数据库PolarDB-X以其出色的性能、可靠性和扩展性闻名,在多种业务场景中广泛应用。尤其在列存储模式下,PolarDB-X针对分析型查询进行了优化,显著提升了数据读取效率。本文通过TPC-H基准测试探讨PolarDB-X列存执行计划的优化策略,包括高效数据扫描、专用查询算法以及动态调整执行计划等功能,以满足复杂查询的需求并提高数据分析性能。
104 1