暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

压测工具 pgbench

小鲁菜 2024-10-18
113

pgbench -i -s 10 xa


    • -i:这个参数告诉 pgbench 初始化测试环境,包括创建所需的表和插入测试数据。pgbench -i会创建四个表pgbench_accounts、 pgbench_branchespgbench_history以及pgbench_tellers,如果同名表已经存在会被先删除。如果你已经有同名表,一定注意要使用另一个数据库!

    • -s 10:这个参数设置初始化的规模因子为 10。规模因子用于确定初始化数据的规模,即表中数据的多少。规模因子为 10 通常意味着 pgbench 将创建 100,000 行数据(每个规模因子单位代表 10,000 行数据)。

    • xa:这是要初始化的数据库名称。



输出信息解释:

  • dropping old tables...pgbench 在初始化之前会尝试删除旧的测试表,以确保测试环境是干净的。

  • 注意: 表 "pgbench_accounts" 不存在:这表明 pgbench 在尝试删除旧表时发现 pgbench_accounts 表不存在,这可能是因为之前没有运行过初始化命令,或者数据库是全新的。

  • creating tables...pgbench 开始根据初始化参数创建新的测试表。

  • generating data (client-side)...pgbench 在客户端生成测试数据。这意味着数据是由运行 pgbench 的机器生成的,而不是在数据库服务器上生成的。

  • 1000000 of 1000000 tuples (100%) done (elapsed 6.30 s, remaining 0.00 s):这表明 pgbench 已经完成了 1,000,000 行数据的生成,总共用时 6.30 秒。

  • vacuuming...pgbench 在数据加载完成后执行 VACUUM 操作,以整理数据库物理空间并优化查询性能。

  • creating primary keys...pgbench 为创建的表添加主键。

  • done in 8.56 s (drop tables 0.00 s, create tables 0.02 s, client-side generate 6.39 s, vacuum 0.50 s, primary keys 1.66 s).:这是整个初始化过程的总结,显示了每个步骤所花费的时间。整个过程用时 8.56 秒,其中生成数据花费了 6.39 秒,创建表花费了 0.02 秒,VACUUM 操作花费了 0.50 秒,添加主键花费了 1.66 秒。

这个命令和输出表明 pgbench 成功地在 xa 数据库上初始化了测试环境,准备了大量数据,为后续的性能测试做好了准备。


对sql查询压测100并发

DROP TABLE IF EXISTS tb_user_log;
CREATE TABLE tb_user_log (
uid INT NOT NULL ,
artical_id INT NOT NULL ,
in_time datetime ,
out_time datetime ,
sign_in INT DEFAULT 0
) ;

INSERT INTO tb_user_log(uid, artical_id, in_time, out_time, sign_in) VALUES
(101, 0, '2021-07-07 10:00:00', '2021-07-07 10:00:09', 1),
(101, 0, '2021-07-08 10:00:00', '2021-07-08 10:00:09', 1),
(101, 0, '2021-07-09 10:00:00', '2021-07-09 10:00:42', 1),
(101, 0, '2021-07-10 10:00:00', '2021-07-10 10:00:09', 1),
(101, 0, '2021-07-11 23:59:55', '2021-07-11 23:59:59', 1),
(101, 0, '2021-07-12 10:00:28', '2021-07-12 10:00:50', 1),
(101, 0, '2021-07-13 10:00:28', '2021-07-13 10:00:50', 1),
(102, 0, '2021-10-01 10:00:28', '2021-10-01 10:00:50', 1),
(102, 0, '2021-10-02 10:00:01', '2021-10-02 10:01:50', 1),
(102, 0, '2021-10-03 11:00:55', '2021-10-03 11:00:59', 1),
(102, 0, '2021-10-04 11:00:45', '2021-10-04 11:00:55', 0),
(102, 0, '2021-10-05 11:00:53', '2021-10-05 11:00:59', 1),
(102, 0, '2021-10-06 11:00:45', '2021-10-06 11:00:55', 1);

--先执行查询这个sql能否正确执行,再编辑文件写入如下:
vi   tb.sql
WITH
-- 计算每个用户的签到日期
active_log AS (
SELECT DISTINCT uid,
date_trunc('day', in_time) AS sign_date
FROM tb_user_log
WHERE sign_in = 1
AND artical_id = 0
AND date_trunc('day', in_time) BETWEEN '2021-07-07' AND '2021-10-31'
),
-- 计算每个用户每个签到日期的两个下标:index_1 = 行下标, index_2 = 日期下标(当 index_1 与 index_2 的差相同时,就是同一次连续签到)
sign_log AS (
SELECT uid,
sign_date,
ROW_NUMBER() OVER (PARTITION BY uid ORDER BY sign_date) AS index_1,
(extract(day from sign_date) - extract(day from '2021-07-07'::date)) AS index_2
FROM active_log
),
-- 计算每个用户每一天领取的金币数量
coin_log AS (
SELECT uid,
sign_date,
CASE MOD(ROW_NUMBER() OVER (PARTITION BY uid, index_1 - index_2 ORDER BY sign_date), 7)
WHEN 3 THEN 3
WHEN 7 THEN 7
ELSE 1 END AS coin
FROM sign_log
)
SELECT uid,
to_char(sign_date, 'YYYYMM') AS month,
SUM(coin) AS coin
FROM coin_log
GROUP BY uid, to_char(sign_date, 'YYYYMM')
ORDER BY month, uid;

执行命令:其中-c 客户端数量, -j 线程数量

pgbench -U halo -d metadata -p 1521 -c 10 -j 10 -T 60 -f tb.sql



1、未开启软解析:statement_sharing=none
2、开启软解析:statement_sharing=normal

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论