JMeter+Oracle海量插入性能优化:如何提升至20000TPS?
优化建议:提升Oracle插入TPS至目标值
一、JMeter批量插入配置(核心优化点)
1. 启用JDBC Request批量模式
- 在JMeter的JDBC Request元件中,勾选「Use batches」选项
- 设置「Batch size」(建议100-500,根据单条数据大小调整),代表每次批量插入的行数
- 同步调整CSV Data Set Config:
- 将「Number of lines to read at once」设为与Batch size一致的值
- 共享模式选择「All threads」,避免多线程读取文件时的冲突
2. 构造批量插入SQL
替换单行INSERT语法,改用Oracle支持的多行批量写法:
INSERT INTO HR.EMPLOYEES ( EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID) VALUES (?, ?, ?, ?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?, ?, nullif(?, 'null'), ?, ?), (?, ?, ?, ?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?, ?, nullif(?, 'null'), ?, ?), -- 重复n行,n等于你的Batch size (?, ?, ?, ?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?, ?, nullif(?, 'null'), ?, ?)
- 注意:CSV文件的总列数要与SQL中占位符总数匹配(即Batch size × 11列)
二、Oracle数据库层面优化
1. 临时禁用索引和外键(测试环境专用)
插入操作会触发索引维护和外键验证,测试期间可临时关闭:
-- 禁用单条索引 ALTER INDEX <索引名> UNUSABLE; -- 禁用单条外键约束 ALTER TABLE HR.EMPLOYEES DISABLE CONSTRAINT <外键名>;
插入完成后恢复:
-- 重建索引 ALTER INDEX <索引名> REBUILD; -- 启用外键 ALTER TABLE HR.EMPLOYEES ENABLE CONSTRAINT <外键名>;
批量生成禁用语句(针对所有索引/外键):
-- 生成禁用索引语句 SELECT 'ALTER INDEX ' || index_name || ' UNUSABLE;' FROM user_indexes WHERE table_name = 'EMPLOYEES'; -- 生成禁用外键语句 SELECT 'ALTER TABLE HR.EMPLOYEES DISABLE CONSTRAINT ' || constraint_name || ';' FROM user_constraints WHERE table_name = 'EMPLOYEES' AND constraint_type = 'R';
2. 使用直接路径插入
添加/*+ APPEND */提示跳过数据库缓冲区,直接写入数据文件:
INSERT /*+ APPEND */ INTO HR.EMPLOYEES (...) VALUES (...)
批量插入时结合并行优化:
INSERT /*+ APPEND PARALLEL(4) */ INTO HR.EMPLOYEES (...) VALUES (...)
注意:直接路径插入会锁定表,测试期间确保无其他业务操作。
3. 调整数据库核心参数
- 日志优化:测试环境临时关闭归档模式,减少日志写入开销:
同时增大在线日志文件大小(比如改为10G),降低日志切换频率:SHUTDOWN IMMEDIATE; STARTUP MOUNT; ALTER DATABASE NOARCHIVELOG; ALTER DATABASE OPEN;ALTER DATABASE ADD LOGFILE GROUP 4 ('/path/to/log4.log') SIZE 10G; ALTER DATABASE DROP LOGFILE GROUP 1; -- 重复操作替换所有日志组 - 内存调整:增大PGA和SGA分配,提升内存处理能力:
ALTER SYSTEM SET PGA_AGGREGATE_TARGET = 8G SCOPE=SPFILE; ALTER SYSTEM SET SGA_TARGET = 16G SCOPE=SPFILE; -- 重启数据库生效 - 延迟约束验证:若外键关联数据已提前存在,设置约束为延迟验证:
ALTER TABLE HR.EMPLOYEES MODIFY CONSTRAINT <外键名> DEFERRABLE INITIALLY DEFERRED;
4. 表空间优化
确保EMPLOYEES表所在表空间开启自动扩展,避免空间不足导致插入停滞:
ALTER TABLESPACE <表空间名> AUTOEXTEND ON NEXT 1G MAXSIZE UNLIMITED;
三、JMeter自身性能优化
1. 采用非GUI模式运行
GUI模式会消耗大量系统资源,测试时用命令行启动:
jmeter -n -t your_test_plan.jmx -l result.jtl
2. 优化JDBC连接池
在JDBC Connection Configuration中:
- 设置「Max connections」为线程数的1.2-1.5倍(比如100线程设为150)
- 调整「Connection timeout」和「Validation timeout」为30000ms左右
- 勾选「Validate connection on each use」,确保连接有效性
3. 调整JVM参数
修改jmeter.bat/jmeter.sh中的堆内存参数,提升JMeter处理能力:
HEAP="-Xms4g -Xmx8g"
参数值根据服务器物理内存调整,不超过内存的70%为宜。
4. 禁用不必要的监听器
测试期间关闭View Results Tree、Summary Report等实时监听器,仅保留Backend Listener或仅生成jtl结果文件,减少资源消耗。
四、其他注意事项
- 测试数据文件(CSV)放在本地磁盘,避免网络IO瓶颈
- 确保测试服务器与数据库服务器在同一局域网,降低网络延迟
- 逐步调整批量大小,找到最优值(过大易导致内存溢出,过小则批量效果不明显)
- 用AWR报告监控数据库等待事件,定位具体瓶颈(如日志写入等待、锁等待)
内容的提问来源于stack exchange,提问作者Martim Fernandes
相关产品推荐
相关产品推荐

