pgbench -i -s 10 xa
-i:这个参数告诉pgbench初始化测试环境,包括创建所需的表和插入测试数据。pgbench -i会创建四个表pgbench_accounts、pgbench_branches、pgbench_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




