
# 测试方法
云数据库RDS for PostgreSQL 100%兼容原生PostgreSQL，提供安全可靠、易用稳定、管理便捷的云数据库服务。
#### 测试环境
- 区域：华北-北京四
- 可用分区：可用区1
- 弹性云服务器（Elastic Cloud Server，简称ECS）：规格选择通用计算增强型 \| c6.4xlarge.2 \| 16vCPUs \| 32GB，操作系统镜像使用CentOS 7.6 64bit版本。由于压测工具需要安装额外的编译工具，建议ECS绑定弹性IP。
 
#### 测试工具
Sysbench是一款基于LuaJIT的，模块化多线程基准测试工具，常用于数据库基准测试。通过内置的数据库测试模型，采用多线程并发操作来评估数据库的性能。了解Sysbench更多详情，请访问<https://github.com/akopytov/sysbench>。
本次测试使用的[Sysbench版本](https://github.com/akopytov/sysbench/archive/1.0.18.zip)为1.0.18，具体的安装命令如下：
```
#wget -c https://github.com/akopytov/sysbench/archive/1.0.18.zip
#yum install make automake libtool pkgconfig libaio-devel postgresql-devel
#unzip 1.0.18.zip
#cd sysbench-1.0.18
#./autogen.sh
#./configure --with-pgsql --without-mysql
#make
#make install
```
#### 测试步骤
请根据实际信息，替换数据库、连接IP与用户密码。
1. 导入数据。 
   1. 使用如下命令登录数据库，并创建测试数据库"loadtest"。
      ```
      psql -h<host> -p5432 "dbname=postgres user=root password=<password>" <<TEST
      create database loadtest;
      TEST
      ```
      
   
   2. 使用sysbench命令导入测试背景数据到"loadtest"数据库。
      ```
      sysbench --test=/usr/local/share/sysbench/tests/include/oltp_legacy/oltp.lua --db-driver=pgsql --pgsql-db=loadtest --pgsql-user=root --pgsql-password=<password> --pgsql-port=5432 --pgsql-host=<host> --oltp-tables-count=64 --oltp-table-size=10000000 --num-threads=20 prepare
      ```
      
   
   
   
   
2. 压测数据。 
   ```
   sysbench --test=/usr/local/share/sysbench/tests/include/oltp_legacy/oltp.lua --db-driver=pgsql --pgsql-db=loadtest --pgsql-user=root --pgsql-password=<password> --pgsql-port=5432 --pgsql-host=<host> --oltp-tables-count=64 --oltp-table-size=10000000 --max-time=3600 --max-requests=0 --num-threads=64 --report-interval=3 --forced-shutdown=1 run
   ```
   
   
3. 清理数据。 
   ```
   sysbench --test=/usr/local/share/sysbench/tests/include/oltp_legacy/oltp.lua --db-driver=pgsql --pgsql-db=loadtest --pgsql-user=root --pgsql-password=<password> --pgsql-port=5432 --pgsql-host=<host> --oltp-tables-count=64 --oltp-table-size=10000000 --max-time=3600 --max-requests=0 --num-threads=200 cleanup
   ```
   
   
 
#### 测试模型
1. 表结构
   ```
   CREATE TABLE `sbtest` (
   `id` INTEGER IDENTITY(1,1) NOT NULL,
   `k` INTEGER DEFAULT '0' NOT NULL,
   `c` CHAR(120) DEFAULT '' NOT NULL,
   `pad` CHAR(60) DEFAULT '' NOT NULL,
   PRIMARY KEY (`id`)
   )
   ```
   
2. 读写比
   Sysbench默认提交的事务中包含18条SQL语句，具体执行语句和条数如下：
   - 主键SELECT语句，10条：
     ```
     SELECT c FROM ${rand_table_name} where id=${rand_id};
     ```
     
   
   - 范围SELECT语句，4条：
     ```
     SELECT c FROM ${rand_table_name} WHERE id BETWEEN ${rand_id_start} AND ${rand_id_end};
     SELECT SUM(K) FROM ${rand_table_name} WHERE id BETWEEN ${rand_id_start} AND ${rand_id_end};
     SELECT c FROM ${rand_table_name} WHERE id BETWEEN ${rand_id_start} AND ${rand_id_end} ORDER BY c;
     SELECT DISTINCT c FROM ${rand_table_name} WHERE id BETWEEN ${rand_id_start} AND ${rand_id_end} ORDER BY c;
     ```
     
   
   
   
   - UPDATE语句，2条：
     ```
     UPDATE ${rand_table_name} SET k=k+1 WHERE id=${rand_id}
     UPDATE ${rand_table_name} SET c=${rand_str} WHERE id=${rand_id}
     ```
     
    
   - DELETE语句，1条：
     ```
     DELETE FROM ${rand_table_name} WHERE id=${rand_id}
     ```
     
   
   - INSERT语句，1条：
     ```
     INSERT INTO ${rand_table_name} (id, k, c, pad) VALUES (${rand_id},${rand_k},${rand_str_c},${rand_str_pad})
     ```
     
    
 
#### 测试指标
- **TPS**：Transaction Per Second，数据库每秒执行的事务数，每个事务中包含18条SQL语句。
 
- **QPS**：Query Per Second，数据库每秒执行的SQL数，包含insert、select、update、delete等。
 
