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

Postgresql压力测试pgbench与准不准

任何数据库都有压力测试的需求,每种数据库的压力测试都是要证明这个数据库本身在某种硬件的情

任何数据库都有压力测试的需求,每种数据库的压力测试都是要证明这个数据库本身在某种硬件的情况下,能达到的一种可以承受的工作上的压力。 那么有一个问题压力测试的数据准吗?  其实实际上我个人的回答是, 根本不准,反正我也不怎么信。 

那么久会产生两个问题, 你不信你测他,有脑子有病吧 ?   另一个问题, 为什么不准,有没有准的压力测试?

那么下面就回答

1  压力测试中的方式,大多是测试某种数据库的QPS TPS ,或者这个数据库在每秒能插入多少条数据。  然后就可以大放厥词的说明这个数据库性能很棒。  可这并不是问题的所在,所在的是真有人信。 

众多车企的工信部油耗,你信吗, 反正我不信,为什么是工信部有问题吗?是测试的方式有问题吗?是车子有问题吗? 

都不是,汽车的油耗的测试,是在一个理想的环境中匀速测定出来的,他当然有一定的说服力,从哪里能开出有说服力。

例如某台湾和二汽的合资品牌,工信部测出的油耗有达到了10个,那就是告诉你这车可不省油。有的车子人家测出的油耗只有5.5个,但你开上他就9个油,你说是车子有毛病还是你脚“臭”。 

放到数据库也是一样,测试的标准都不唯一,怎么测试的,测试的数据,以及测试的复杂度都不一样,测试的结果能说明什么, 唯一能说明的就是如果结果太差,那这个数据库一定不行,但如果数据好看,也不能说这个数据库就一定好。 因为一个车子的“跑得快” 一定不是他唯一的主要的指标, 而一个数据库的性能指标,也不是能跑多少TPS ,一秒钟能插入多少数据。 但如果这些指标不行,那就一定不能用这个数据库。

这第一个问题就回答了, 数据我不大信,但还是要看,如果汽车安全五星批发部都告诉你这个车子的安全系数是 3星,那你要是买了他,准备好头盔。

那么对于一个数据库什么是准的测试,其实就是你数据库要上的系统应用,在上面用最大的预估量来进行数据的测试, 如果数据库塌了,你就找到这个数据库的极限,当然如果你看出系统的问题,调整了软件在表设计的某些东西,然后这个数据库不崩溃了,那就说明.......   

言归正传,postgresql的压力测试有么有必要,当然有,但是我们的测试大部分就属于五星批发部, 那么今天五星批发部pgbench 就来测测我们的postgresql 这辆多功能“车”。

1 产生测试的表

通过pg_bench  -i   数据库名,来在指定的数据库下产生4个测试表

pgbench_accounts

pgbench_branches

pgbench_history

pgbench_tellers

 

 

 

 

那么他们在测试的时候使用了什么语句来进行的

 

select count(*) from pgbench_branches

INSERT INTO pgbench_history (tid, bid, aid,delta, mtime) VALUES ($1, $2, $3, $4, CURRENT_TIMESTAMP)

insert intopgbench_tellers(tid,bid,tbalance) values ($1,$2,$3)

UPDATE pgbench_accounts SET abalance =abalance + $1 WHERE aid = $2

UPDATE pgbench_tellers SET tbalance =tbalance + $1 WHERE tid = $2

SELECT abalance FROM pgbench_accounts WHEREaid = $1

insert into pgbench_branches(bid,bbalance)values($1,$2)

当然时间的问题,可能这里也没有总结全pg_bench 执行的语句,实际上pg_bench 执行语句分为两部分

一部分是上面的测试语句,还有一部分是在收集信息并进行测试数据分析的语句,这里就不给出了。

Pgbench 中测试的数据其实是分几个部分的

1 初始化数据

2 运行测试的语句,填充数据改变数据

3 收集运行中的结果,并分析总结计算

4 打印结果

其中–i 是初始化的步骤的参数,-F 主要是在于你是否想进行数据存储的优化,这里的调节可以让你对数据的存储方面的知识的验证得到一些答案,例如你的–fillfactor 100  90  85 60  设置后,你的测试结果有什么变化。

pgbench test -c 10 -j 4  -l -M simple -r-T 30

 

下面同样的测试,仅仅是在–M 参数进行了变化,相关的测试结果中 prepared 的数据输入的方式比普通的方式的tps要好的多,所以可以更能证明,如果你更懂一个数据库,你将获得更多的性能的优势,当然如果你不懂也别把所有的问题都推到他的身上。

当然数据量也是很重要的,如果你需要测试更多的数据,也可以在初始化的时候通过 -s 来加大测试数据, 如果不给相关的测试数据默认是10万,-s 是测试的数据倍数。

另外一个事情是需要注意的是,你的 -c 参数是同时连接postgresql的客户端,注意你填写的客户端,这里不是要和你的最大连接数持平,而是你要和你在某一秒同时工作的连接进行对比,可能一个非常繁忙的系统,在一秒钟同时进行工作的进程不会超过几十个。所以之类这个概念不要误会,否则你调整成1000个,可不是和你认为的1000个的概念一样。



推荐阅读
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • 本文由编程笔记小编整理,介绍了PHP中的MySQL函数库及其常用函数,包括mysql_connect、mysql_error、mysql_select_db、mysql_query、mysql_affected_row、mysql_close等。希望对读者有一定的参考价值。 ... [详细]
  • 本文讨论了在数据库打开和关闭状态下,重新命名或移动数据文件和日志文件的情况。针对性能和维护原因,需要将数据库文件移动到不同的磁盘上或重新分配到新的磁盘上的情况,以及在操作系统级别移动或重命名数据文件但未在数据库层进行重命名导致报错的情况。通过三个方面进行讨论。 ... [详细]
  • 如何在php中将mysql查询结果赋值给变量
    本文介绍了在php中将mysql查询结果赋值给变量的方法,包括从mysql表中查询count(学号)并赋值给一个变量,以及如何将sql中查询单条结果赋值给php页面的一个变量。同时还讨论了php调用mysql查询结果到变量的方法,并提供了示例代码。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • Python SQLAlchemy库的使用方法详解
    本文详细介绍了Python中使用SQLAlchemy库的方法。首先对SQLAlchemy进行了简介,包括其定义、适用的数据库类型等。然后讨论了SQLAlchemy提供的两种主要使用模式,即SQL表达式语言和ORM。针对不同的需求,给出了选择哪种模式的建议。最后,介绍了连接数据库的方法,包括创建SQLAlchemy引擎和执行SQL语句的接口。 ... [详细]
  • Java学习笔记之使用反射+泛型构建通用DAO
    本文介绍了使用反射和泛型构建通用DAO的方法,通过减少代码冗余度来提高开发效率。通过示例说明了如何使用反射和泛型来实现对不同表的相同操作,从而避免重复编写相似的代码。该方法可以在Java学习中起到较大的帮助作用。 ... [详细]
  • 在Oracle11g以前版本中的的DataGuard物理备用数据库,可以以只读的方式打开数据库,但此时MediaRecovery利用日志进行数据同步的过 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文介绍了adg架构设置在企业数据治理中的应用。随着信息技术的发展,企业IT系统的快速发展使得数据成为企业业务增长的新动力,但同时也带来了数据冗余、数据难发现、效率低下、资源消耗等问题。本文讨论了企业面临的几类尖锐问题,并提出了解决方案,包括确保库表结构与系统测试版本一致、避免数据冗余、快速定位问题等。此外,本文还探讨了adg架构在大版本升级、上云服务和微服务治理方面的应用。通过本文的介绍,读者可以了解到adg架构设置的重要性及其在企业数据治理中的应用。 ... [详细]
  • 本文详细介绍了在ASP.NET中获取插入记录的ID的几种方法,包括使用SCOPE_IDENTITY()和IDENT_CURRENT()函数,以及通过ExecuteReader方法执行SQL语句获取ID的步骤。同时,还提供了使用这些方法的示例代码和注意事项。对于需要获取表中最后一个插入操作所产生的ID或马上使用刚插入的新记录ID的开发者来说,本文提供了一些有用的技巧和建议。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
author-avatar
Y死一般的痛过
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有