You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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. 调整数据库核心参数

  • 日志优化:测试环境临时关闭归档模式,减少日志写入开销:
    SHUTDOWN IMMEDIATE;
    STARTUP MOUNT;
    ALTER DATABASE NOARCHIVELOG;
    ALTER DATABASE OPEN;
    
    同时增大在线日志文件大小(比如改为10G),降低日志切换频率:
    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 15:34:50