国产化之达梦数据库性能优化方案

文章目录

    • 达梦数据库(DMDB)体系架构
      • [应用接口层(Application Interface Layer)](#应用接口层(Application Interface Layer))
      • [数据库服务层(Database Service Layer)](#数据库服务层(Database Service Layer))
      • [存储管理层(Storage Management Layer)](#存储管理层(Storage Management Layer))
    • 一、性能优化概述
      • [1.1 优化目标](#1.1 优化目标)
      • [1.2 优化原则](#1.2 优化原则)
      • [1.3 优化策略](#1.3 优化策略)
    • 二、性能分析诊断流程
      • [2.1 性能问题识别](#2.1 性能问题识别)
        • [2.1.1 性能指标监控(KPI查询SQL)](#2.1.1 性能指标监控(KPI查询SQL))
        • [2.1.2 性能瓶颈识别](#2.1.2 性能瓶颈识别)
      • [2.2 性能分析工具](#2.2 性能分析工具)
        • [2.2.1 达梦核心性能视图](#2.2.1 达梦核心性能视图)
        • [2.2.2 性能分析SQL脚本](#2.2.2 性能分析SQL脚本)
    • 三、SQL优化策略
      • [3.1 SQL优化原则](#3.1 SQL优化原则)
      • [3.2 索引优化](#3.2 索引优化)
        • [3.2.1 索引创建策略](#3.2.1 索引创建策略)
        • [3.2.2 索引使用分析](#3.2.2 索引使用分析)
      • [3.3 执行计划分析](#3.3 执行计划分析)
        • [3.3.1 查看执行计划三种方式](#3.3.1 查看执行计划三种方式)
        • [3.3.2 执行计划优化要点](#3.3.2 执行计划优化要点)
      • [3.4 常见SQL优化案例](#3.4 常见SQL优化案例)
    • 四、架构优化策略
      • [4.1 表结构优化](#4.1 表结构优化)
        • [4.1.1 表设计原则](#4.1.1 表设计原则)
        • [4.1.2 分区表设计](#4.1.2 分区表设计)
      • [4.2 读写分离](#4.2 读写分离)
        • [4.2.1 主从复制配置](#4.2.1 主从复制配置)
        • [4.2.2 应用层读写分离](#4.2.2 应用层读写分离)
      • [4.3 连接池优化](#4.3 连接池优化)
        • [4.3.1 HikariCP配置示例](#4.3.1 HikariCP配置示例)
        • [4.3.2 连接池监控](#4.3.2 连接池监控)
    • 五、参数调优策略
      • [5.1 内存参数调优](#5.1 内存参数调优)
        • [5.1.1 缓冲池优化](#5.1.1 缓冲池优化)
        • [5.1.2 排序和哈希缓冲区](#5.1.2 排序和哈希缓冲区)
      • [5.2 连接参数调优](#5.2 连接参数调优)
      • [5.3 优化器参数调优](#5.3 优化器参数调优)
    • 六、硬件优化建议
      • [6.1 CPU优化](#6.1 CPU优化)
      • [6.2 内存优化](#6.2 内存优化)
      • [6.3 存储优化](#6.3 存储优化)
      • [6.4 网络优化](#6.4 网络优化)
    • 七、常见性能问题诊断与解决
      • [7.1 慢查询问题](#7.1 慢查询问题)
      • [7.2 锁等待问题](#7.2 锁等待问题)
      • [7.3 内存不足问题](#7.3 内存不足问题)
      • [7.4 IO瓶颈问题](#7.4 IO瓶颈问题)
    • 八、性能测试与验证
      • [8.1 性能测试方法](#8.1 性能测试方法)
        • [8.1.1 基准测试](#8.1.1 基准测试)
        • [8.1.2 sysbench压力测试](#8.1.2 sysbench压力测试)
      • [8.2 优化效果验证](#8.2 优化效果验证)
        • [8.2.1 优化前后对比](#8.2.1 优化前后对比)
        • [8.2.2 建立持续监控视图](#8.2.2 建立持续监控视图)
    • 九、优化检查清单
      • [9.1 优化前检查](#9.1 优化前检查)
      • [9.2 SQL优化检查](#9.2 SQL优化检查)
      • [9.3 参数优化检查](#9.3 参数优化检查)
      • [9.4 架构优化检查](#9.4 架构优化检查)
      • [9.5 优化后验证](#9.5 优化后验证)
    • 十、优化案例
    • 十一、持续优化建议

达梦数据库(DMDB)体系架构

应用接口层(Application Interface Layer)

  • 标准接口:JDBC/ODBC,提供标准Java数据库连接、开放数据库连接,支持多开发语言、应用程序访问,具备跨平台、连接池、XA事务、异步操作、流式处理能力
  • 原生接口 :DPI/DCI,为C/C++、Python等语言提供原生数据库访问,高性能、多语言、低延迟
  • 工具专用接口:为达梦管理工具、监控工具、开发工具提供专用接口,支撑数据库管理、性能监控、开发调试、运维管理、安全审计、自动化运维

适配应用:Java应用、.NET应用

数据库服务层(Database Service Layer)

  1. SQL解析与优化:词法/语法/语义分析、生成执行计划、查询重写、成本优化、自适应优化
  2. 事务管理:支持ACID事务、隔离级别控制、并发控制、MVCC、分布式事务、锁管理、死锁检测
  3. 存储引擎:数据存储、索引管理、空间分配与回收,支持行存储、列存储、分区表、数据压缩、闪回技术
  4. 缓存管理:管理数据缓存池,采用LRU算法优化内存、减少磁盘I/O,含数据缓存、自适应缓存、查询缓存、多级缓存

存储管理层(Storage Management Layer)

  1. 文件系统管理:管理数据库/日志/控制文件,处理文件创建、扩展、空间分配回收;含表空间、数据文件、在线重组
  2. 重做日志管理:记录所有数据修改,支撑故障恢复、数据持久性、日志归档;支持组提交、并行日志、闪回日志
  3. 备份恢复管理:全量备份、增量备份、日志备份、在线热备、灾难恢复、时间点恢复、块级恢复,保障数据安全

核心组件:应用接口组件、SQL处理组件、事务管理组件、存储引擎组件、文件管理组件


一、性能优化概述

1.1 优化目标

  • 提升吞吐量:提高QPS(每秒查询数)和TPS(每秒事务数)
  • 降低响应时间:减少SQL执行时间和事务响应时间
  • 提高资源利用率:优化CPU、内存、IO等资源使用
  • 保障系统稳定性:避免性能瓶颈引发系统故障

1.2 优化原则

  1. 系统性原则:从整体架构到具体参数,系统化优化
  2. 数据驱动原则:基于监控数据和性能指标开展优化
  3. 渐进式原则:逐步优化,每次调整后验证效果
  4. 业务优先原则:优化不影响业务功能与数据一致性
  5. 可回滚原则:重要变更提前制定回滚方案

1.3 优化策略

复制代码
性能优化策略
├── 性能分析
│   ├── 性能指标收集
│   ├── 瓶颈识别
│   └── 根因分析
├── 优化策略制定
│   ├── 架构优化
│   ├── SQL优化
│   ├── 参数调优
│   └── 硬件优化
├── 优化实施
│   ├── 测试环境验证
│   ├── 生产环境实施
│   └── 效果监控
└── 持续优化
    ├── 性能基线建立
    ├── 定期评估
    └── 优化迭代

二、性能分析诊断流程

2.1 性能问题识别

2.1.1 性能指标监控(KPI查询SQL)
  1. TPS统计
sql 复制代码
SELECT 
    'TPS'AS METRIC, 
    COUNT(*) / (SELECT DATEDIFF(SECOND, MIN(LOG_TIME), MAX(LOG_TIME)) FROM V$SQL_HISTORY) AS VALUE
FROM V$SQL_HISTORY
WHERE LOG_TIME > DATEADD(MINUTE, -5, SYSDATE);
  1. 响应时间分布
sql 复制代码
SELECT 
    CASE
        WHEN ELAPSED_TIME <100 THEN'<100ms'
        WHEN ELAPSED_TIME <500 THEN'100-500ms'
        WHEN ELAPSED_TIME <1000 THEN'500ms-1s'
        WHEN ELAPSED_TIME <5000 THEN'1s-5s'
        ELSE'>5s'
    END AS TIME_RANGE,
    COUNT(*) AS COUNT,
    ROUND(COUNT(*) *100.0/SUM(COUNT(*)) OVER(), 2) AS PERCENTAGE
FROM V$SQL_HISTORY
WHERE LOG_TIME > DATEADD(MINUTE, -5, SYSDATE)
GROUP BY CASE
    WHEN ELAPSED_TIME <100 THEN'<100ms'
    WHEN ELAPSED_TIME <500 THEN'100-500ms'
    WHEN ELAPSED_TIME <1000 THEN'500ms-1s'
    WHEN ELAPSED_TIME <5000 THEN'1s-5s'
    ELSE'>5s'
END;
  1. 缓冲池命中率
sql 复制代码
SELECT 
    POOL_ID,
    ROUND((1- DISK_READS /NULLIF(TOTAL_READS, 0)) *100, 2) AS HIT_RATE
FROM V$BUFFERPOOL
WHERE TOTAL_READS >0;
  1. 锁等待情况
sql 复制代码
SELECT 
    COUNT(*) AS LOCK_WAITS,
    AVG(WAIT_TIME) AS AVG_WAIT_TIME,
    MAX(WAIT_TIME) AS MAX_WAIT_TIME
FROM V$LOCK
WHERE BLOCKED =1;
2.1.2 性能瓶颈识别
瓶颈类型 症状 诊断SQL 解决办法
CPU瓶颈 CPU使用率持续>80%,查询响应慢 SELECT * FROM V$SESSIONS WHERE STATUS='ACTIVE' 优化SQL、扩容CPU、调整并行度
内存瓶颈 缓冲池命中率<90%,频繁磁盘IO SELECT * FROM V$BUFFERPOOL 增大BUFFER、优化内存分配
IO瓶颈 磁盘IO等待长,IO使用率>80% SELECT * FROM V$FILESTAT 优化SQL减IO、更换SSD、调IO参数
锁竞争 大量锁等待,事务响应慢 SELECT * FROM V$LOCK WHERE BLOCKED=1 优化事务逻辑、调隔离级别、优化索引

2.2 性能分析工具

2.2.1 达梦核心性能视图
  • V$SESSIONS:会话信息
  • V$SQL_HISTORY:SQL执行历史
  • V$BUFFERPOOL:缓冲池状态
  • V$LOCK:锁信息
  • V$FILESTAT:文件IO统计
  • V$SORT:排序操作
  • V$TRX:事务信息
  • V$CACHEITEM:缓存项信息
  • V$SYSTEM_EVENT:系统事件
  • V$SESSION_WAIT:会话等待事件
2.2.2 性能分析SQL脚本
  1. 慢查询TOP10
sql 复制代码
SELECT TOP 10
    SQL_TEXT,
    EXEC_COUNT,
    ELAPSED_TIME,
    ROUND(ELAPSED_TIME / NULLIF(EXEC_COUNT, 0), 2) AS AVG_TIME,
    LOG_TIME
FROM V$SQL_HISTORY
WHERE ELAPSED_TIME > 1000
ORDER BY ELAPSED_TIME DESC;
  1. 会话资源消耗TOP10
sql 复制代码
SELECT TOP 10
    S.SESS_ID,
    S.USER_NAME,
    S.SQL_TEXT,
    S.CPU_TIME,
    S.MEM_USED,
    S.IO_READS,
    S.IO_WRITES
FROM V$SESSIONS S
WHERE S.STATUS = 'ACTIVE'
ORDER BY S.CPU_TIME DESC;

三、SQL优化策略

3.1 SQL优化原则

  1. 避免全表扫描,WHERE条件合理使用索引
  2. 按需查询字段,减少数据传输
  3. 优化JOIN类型与关联顺序
  4. 尽量用JOIN替代子查询
  5. 合理创建索引,避免索引冗余

3.2 索引优化

3.2.1 索引创建策略
sql 复制代码
-- 1. 主键自动建索引
CREATE TABLE T1 (
    ID INT PRIMARY KEY,
    NAME VARCHAR(100)
);

-- 2. 外键建索引
CREATE INDEX IDX_FK ON T1(NAME);

-- 3. 频繁查询列建索引
CREATE INDEX IDX_QUERY ON T1(NAME, STATUS);

-- 4. 复合索引:等值在前、范围在后
CREATE INDEX IDX_COMPOSITE ON T1(STATUS, CREATE_TIME);
3.2.2 索引使用分析
sql 复制代码
-- 查看索引信息
SELECT 
    T.TABLE_NAME,
    I.INDEX_NAME,
    I.INDEX_TYPE,
    I.UNIQUENESS,
    I.STATUS
FROM DBA_INDEXES I
JOIN DBA_TABLES T ON I.TABLE_NAME = T.TABLE_NAME
WHERE T.OWNER ='SYSDBA'
ORDER BY T.TABLE_NAME;

-- 查找未使用索引
SELECT 
    I.INDEX_NAME,
    I.TABLE_NAME,
    I.NUM_ROWS
FROM DBA_INDEXES I
WHERE I.OWNER ='SYSDBA'
AND I.INDEX_NAME NOT IN (
    SELECT DISTINCT INDEX_NAME 
    FROM V$SQL_PLAN 
    WHERE INDEX_NAME IS NOT NULL
);

3.3 执行计划分析

3.3.1 查看执行计划三种方式
sql 复制代码
-- 方式1
EXPLAIN SELECT*FROM T1 WHERE ID =100;

-- 方式2
EXPLAIN FOR SELECT*FROM T1 WHERE ID =100;
SELECT*FROM V$EXPLAIN_PLAN;

-- 方式3
SET AUTOTRACE ON;
SELECT*FROM T1 WHERE ID =100;
3.3.2 执行计划优化要点
  1. 全表扫描(TABLE SCAN):大表禁止全表扫描,新建索引或优化WHERE条件
  2. 索引扫描(INDEX SCAN):保证索引选择性足够高
  3. 嵌套循环(NESTED LOOP):适合小表JOIN,内表必须建索引
  4. 哈希JOIN(HASH JOIN):适合大表JOIN,需充足内存
  5. 排序(SORT):尽量用索引规避排序,减少资源消耗

3.4 常见SQL优化案例

案例1:禁止SELECT *
sql 复制代码
-- 不推荐
SELECT * FROM T1 WHERE ID = 100;
-- 推荐
SELECT ID, NAME, STATUS FROM T1 WHERE ID = 100;
案例2:IN子查询改JOIN
sql 复制代码
-- 不推荐
SELECT * FROM T1 WHERE ID IN (SELECT ID FROM T2 WHERE STATUS = 1);
-- 推荐
SELECT T1.* FROM T1 
JOIN T2 ON T1.ID = T2.ID 
WHERE T2.STATUS = 1;
案例3:LIKE查询优化
sql 复制代码
-- 不推荐(前导%无法走索引)
SELECT*FROM T1 WHERE NAME LIKE'%TEST%';
-- 推荐(后置%可走索引)
SELECT*FROM T1 WHERE NAME LIKE'TEST%';

-- 全文索引方案
CREATE FULLTEXT INDEX IDX_FT_NAME ON T1(NAME);
SELECT*FROM T1 WHERECONTAINS(NAME, 'TEST');
案例4:批量操作优化
sql 复制代码
-- 不推荐 逐条插入
FOR I IN 1..1000 LOOP
    INSERT INTO T1 VALUES (I, 'NAME' || I);
END LOOP;

-- 推荐 批量插入
INSERT INTO T1 
SELECT LEVEL, 'NAME' || LEVEL 
FROM DUAL 
CONNECT BY LEVEL <= 1000;

四、架构优化策略

4.1 表结构优化

4.1.1 表设计原则
  1. 规范化设计,减少数据冗余
  2. 超大表采用分区表
  3. 合理选择字段数据类型与长度
  4. 高频查询字段放在表字段靠前位置
4.1.2 分区表设计
sql 复制代码
-- 范围分区
CREATE TABLE T_ORDER (
    ORDER_ID INT,
    ORDER_DATE DATE,
    AMOUNT DECIMAL(10,2)
) PARTITION BY RANGE(ORDER_DATE) (
    PARTITION P202301 VALUES LESS THAN ('2023-02-01'),
    PARTITION P202302 VALUES LESS THAN ('2023-03-01'),
    PARTITION P202303 VALUES LESS THAN ('2023-04-01'),
    PARTITION PMAX VALUES LESS THAN (MAXVALUE)
);

-- 哈希分区
CREATE TABLE T_USER (
    USER_ID INT,
    USER_NAME VARCHAR(100)
) PARTITION BY HASH(USER_ID)
PARTITIONS 8;

4.2 读写分离

4.2.1 主从复制配置
sql 复制代码
-- 主库配置
ALTER SYSTEM SET 'ARCH_INI'=1;
ALTER SYSTEM SET 'ARCH_DEST'='/dm/arch'BOTH;

dmarch.ini 从库MAL配置:

ini 复制代码
[MAL_INST1]
MAL_INST_NAME = DMSERVER1
MAL_HOST =192.168.1.10
MAL_PORT =61141
[MAL_INST2]
MAL_INST_NAME = DMSERVER2
MAL_HOST =192.168.1.11
MAL_PORT =61141
4.2.2 应用层读写分离
java 复制代码
// 主库写
String masterUrl="jdbc:dm://192.168.1.10:5236/DMSERVER";
// 从库读
String slaveUrl="jdbc:dm://192.168.1.11:5236/DMSERVER";

// HikariCP配置主库
HikariConfig config=new HikariConfig();
config.setJdbcUrl(masterUrl);
config.setReadOnly(false);

4.3 连接池优化

4.3.1 HikariCP配置示例
properties 复制代码
spring.datasource.hikari.minimum-idle=10
spring.datasource.hikari.maximum-pool-size=50
spring.datasource.hikari.connection-timeout=30000
spring.datasource.hikari.idle-timeout=600000
spring.datasource.hikari.max-lifetime=1800000
spring.datasource.hikari.leak-detection-threshold=60000
4.3.2 连接池监控
sql 复制代码
-- 当前总连接数
SELECT COUNT(*) FROM V$SESSIONS;

-- 连接详情
SELECT 
    USER_NAME,
    STATUS,
    LOGIN_TIME,
    LAST_SQL_TIME
FROM V$SESSIONS
ORDER BY LOGIN_TIME DESC;

五、参数调优策略

5.1 内存参数调优

5.1.1 缓冲池优化
sql 复制代码
-- 查看缓冲池配置
SELECT*FROM V$PARAMETERWHERE NAME = 'BUFFER';

-- 调整缓冲池大小(需重启)
ALTER SYSTEM SET 'BUFFER'=1000000 SPFILE;

-- 缓冲池命中率查询
SELECT 
    POOL_ID,
    TOTAL_READS,
    DISK_READS,
    ROUND((1- DISK_READS /NULLIF(TOTAL_READS, 0)) *100, 2) AS HIT_RATE
FROM V$BUFFERPOOL;

调优建议

  • 缓冲池命中率目标:>95%
  • BUFFER设为物理内存60%-70%
  • 高并发增大BUFFER_POOLS
5.1.2 排序和哈希缓冲区
sql 复制代码
-- 查看排序统计
SELECT*FROM V$SORT;

-- 调整排序缓冲区
ALTER SYSTEM SET 'SORT_BUF_SIZE'=1024 BOTH;

-- 调整哈希缓冲区
ALTER SYSTEM SET 'HASH_SIZE'=20000 BOTH;

5.2 连接参数调优

sql 复制代码
-- 查看连接配置
SELECT*FROM V$PARAMETERWHERE NAME IN ('MAX_SESSIONS', 'MAX_CONN');

-- 调整最大会话数
ALTER SYSTEM SET 'MAX_SESSIONS'=2000 SPFILE;

-- 会话超时时间
ALTER SYSTEM SET 'SESSION_TIMEOUT'=1800 BOTH;

5.3 优化器参数调优

sql 复制代码
-- 设置优化器模式
ALTER SYSTEM SET 'OPTIMIZER_MODE'=1 BOTH;

-- 开启自动统计信息收集
ALTER SYSTEM SET 'AUTO_STAT_OPEN'=1 BOTH;

-- 手动收集表统计信息
DBMS_STATS.GATHER_TABLE_STATS('SYSDBA', 'T1');

六、硬件优化建议

6.1 CPU优化

  1. 选型
    • OLTP:高主频CPU(>3.0GHz)
    • OLAP:多核心CPU(>16核)
  2. CPU绑定
bash 复制代码
taskset -cp 0-7 <PID>

6.2 内存优化

  1. 容量:最低16GB;推荐64GB-256GB;超大库512GB+
  2. 分配比例
    • 操作系统预留:20%-30%
    • 数据库缓冲池:60%-70%
    • 其他进程:10%-20%

6.3 存储优化

  1. 磁盘选型
    • 数据文件:SSD/NVMe SSD
    • 日志文件:独立SSD
    • 归档文件:SAS/SATA
  2. RAID配置
    • 数据盘:RAID 10
    • 日志盘:RAID 1
    • 归档盘:RAID 5
  3. 文件系统 :Linux推荐ext4/xfs,挂载参数 noatime,nodiratime

6.4 网络优化

  1. 带宽:内网万兆、跨机房专线
  2. TCP内核参数
bash 复制代码
net.core.rmem_max = 134217728
net.core.wmem_max = 134217728
net.ipv4.tcp_rmem = 4096 87380 134217728
net.ipv4.tcp_wmem = 4096 65536 134217728

七、常见性能问题诊断与解决

7.1 慢查询问题

诊断

sql 复制代码
-- 慢查询TOP20
SELECT TOP 20
    SQL_TEXT,
    EXEC_COUNT,
    ELAPSED_TIME,
    ROUND(ELAPSED_TIME /NULLIF(EXEC_COUNT, 0), 2) AS AVG_TIME
FROM V$SQL_HISTORY
WHERE ELAPSED_TIME >1000
ORDER BY ELAPSED_TIME DESC;

-- 分析执行计划
EXPLAIN FOR <慢查询SQL>;
SELECT*FROM V$EXPLAIN_PLAN;

解决

  1. 新增索引:CREATE INDEX IDX_COL ON TABLE_NAME(COLUMN_NAME);
  2. 优化SQL:规避全表扫描、调整JOIN顺序、精简子查询
  3. 更新统计信息:DBMS_STATS.GATHER_TABLE_STATS('SYSDBA', 'TABLE_NAME');

7.2 锁等待问题

诊断

sql 复制代码
SELECT 
    L.SESS_ID,
    L.TABLE_NAME,
    L.LOCK_TYPE,
    L.BLOCKED,
    S.SQL_TEXT
FROM V$LOCK L
JOIN V$SESSIONS S ON L.SESS_ID = S.SESS_ID
WHERE L.BLOCKED = 1;

解决

  1. 优化事务:缩短事务时长、减少锁持有、避免长事务
  2. 调整隔离级别:ALTER SESSION SET ISOLATION_LEVEL = 1;(读已提交)
  3. 优化索引:缩小锁范围、使用唯一索引

7.3 内存不足问题

诊断

sql 复制代码
-- 缓冲池内存使用率
SELECT 
    POOL_ID,
    TOTAL_SIZE,
    USED_SIZE,
    ROUND(USED_SIZE * 100.0 / TOTAL_SIZE, 2) AS USAGE_RATE
FROM V$BUFFERPOOL;

-- 排序磁盘溢出
SELECT * FROM V$SORT WHERE SPILL_COUNT > 0;

解决

  1. 调大内存参数
sql 复制代码
ALTER SYSTEM SET 'BUFFER' = <新值> SPFILE;
ALTER SYSTEM SET 'SORT_BUF_SIZE' = <新值> BOTH;
  1. SQL优化:减少排序、优化JOIN、大数据分批处理

7.4 IO瓶颈问题

诊断

sql 复制代码
SELECT 
    FILE_NAME,
    PHY_RD,
    PHY_WR,
    SINGLE_BLK_RD,
    MULTI_BLK_RD
FROM V$FILESTAT
ORDER BY PHY_RD + PHY_WR DESC;

解决

  1. SQL层面:加索引、减少全表扫描、优化JOIN
  2. 硬件升级:更换SSD、提升IO带宽
  3. 参数调优:
sql 复制代码
ALTER SYSTEM SET 'RLOG_BUF_SIZE' = 8192 BOTH;

八、性能测试与验证

8.1 性能测试方法

8.1.1 基准测试
sql 复制代码
-- 新建性能基线表
CREATE TABLE PERF_BASELINE (
    TEST_TIME DATE,
    TPS NUMBER,
    AVG_RESPONSE_TIME NUMBER,
    BUFFER_HIT_RATE NUMBER
);

-- 插入测试结果
INSERT INTO PERF_BASELINE VALUES (
    SYSDATE,
    <TPS值>,
    <平均响应时间>,
    <缓冲池命中率>
);
8.1.2 sysbench压力测试
bash 复制代码
sysbench oltp_read_write \
--db-driver=dm \
--dm-host=192.168.1.10 \
--dm-port=5236 \
--dm-user=SYSDBA \
--dm-password=SYSDBA \
--dm-db=DMSERVER \
--tables=10 \
--table-size=100000 \
--threads=100 \
--time=300 \
--report-interval=10 \
run

8.2 优化效果验证

8.2.1 优化前后对比
sql 复制代码
SELECT 
    B.TEST_TIME AS BEFORE_TIME,
    B.TPS AS BEFORE_TPS,
    A.TEST_TIME AS AFTER_TIME,
    A.TPS AS AFTER_TPS,
    ROUND((A.TPS - B.TPS) * 100.0 / B.TPS, 2) AS IMPROVEMENT
FROM PERF_BASELINE B CROSS JOIN PERF_BASELINE A
WHERE B.TEST_TIME < A.TEST_TIME
ORDER BY A.TEST_TIME DESC;
8.2.2 建立持续监控视图
sql 复制代码
CREATE VIEW V_PERF_MONITOR AS
SELECT 
    SYSDATE AS MONITOR_TIME,
    (SELECTCOUNT(*) FROM V$SQL_HISTORY 
     WHERE LOG_TIME > DATEADD(MINUTE, -1, SYSDATE)) AS TPS,
    (SELECTAVG(ELAPSED_TIME) FROM V$SQL_HISTORY 
     WHERE LOG_TIME > DATEADD(MINUTE, -1, SYSDATE)) AS AVG_RESPONSE_TIME,
    (SELECT ROUND((1-SUM(DISK_READS) /NULLIF(SUM(TOTAL_READS), 0)) *100, 2) 
     FROM V$BUFFERPOOL) AS BUFFER_HIT_RATE;

九、优化检查清单

9.1 优化前检查

  • 收集性能基线数据
  • 识别性能瓶颈与根因
  • 分析业务负载特点
  • 评估现有硬件资源
  • 制定优化方案与回滚计划

9.2 SQL优化检查

  • 核查慢查询日志
  • 分析SQL执行计划
  • 校验索引有效性
  • 优化JOIN关联逻辑
  • 杜绝大表全表扫描
  • 精简冗余子查询

9.3 参数优化检查

  • 缓冲池大小配置合理
  • 最大连接数适配业务
  • 排序/哈希缓冲区充足
  • 优化器参数配置正确
  • 日志归档参数合理

9.4 架构优化检查

  • 表结构设计规范
  • 大表合理使用分区
  • 索引体系设计优化
  • 主从读写分离落地
  • 应用连接池参数合理

9.5 优化后验证

  • 核心性能指标明显改善
  • 业务功能无异常
  • CPU/内存/IO资源占用合理
  • 系统长期运行稳定
  • 建立新版本性能基线

十、优化案例

案例1:高并发OLTP系统优化

问题

  • TPS:5000+
  • 平均响应时间:200ms
  • 缓冲池命中率:85%
  • CPU使用率:90%

优化措施

  1. 缓冲池BUFFER从500000扩容至1000000
  2. 缓冲池数量BUFFER_POOLS从1调至8
  3. 热点查询新增索引
  4. 调整连接池大小与超时参数

优化效果

  • TPS提升至8000+
  • 平均响应时间降至80ms
  • 缓冲池命中率升至98%
  • CPU使用率降至60%

案例2:大数据量OLAP系统优化

问题

  • 复杂查询执行超30秒
  • 排序频繁溢出磁盘
  • 未启用并行查询

优化措施

  1. 开启并行查询:PARALLEL_POLICY=1MAX_PARALLEL_DEGREE=16
  2. 排序缓冲区SORT_BUF_SIZE 512调至2048
  3. 哈希缓冲区HASH_SIZE 10000调至50000
  4. 定期更新表统计信息

优化效果

  • 查询耗时降至5-10秒
  • 排序无磁盘溢出
  • 并行查询资源利用率大幅提升

案例3:锁等待问题优化

问题

  • 大量锁等待
  • 事务响应慢
  • 死锁频发

优化措施

  1. 隔离级别从可重复读改为读已提交
  2. 精简事务逻辑、缩短锁持有时间
  3. LOCK_TABLE从2000调至8000
  4. 热点表新增唯一索引

优化效果

  • 锁等待减少90%
  • 事务响应时间降低50%
  • 死锁问题基本消除

十一、持续优化建议

  1. 搭建性能监控体系:实时采集KPI、配置告警、趋势分析
  2. 定期性能评估:每周输出性能报告、每月深度分析、季度整体优化复盘
  3. 性能基线常态化管理:固化基线指标、跟踪性能波动、及时识别性能退化
相关推荐
yyyyyyyuande2 小时前
LSEG美股行情接入经验分享
性能优化·go
Volunteer Technology2 小时前
Spring AI MCP 案例-WebFlux SSE传输模式 (九)
java·数据库·人工智能·spring
betazhou3 小时前
SQL server数据库镜像同步技术
数据库·sql server·高可用·数据库镜像
mpHH3 小时前
postgresql-分区表
数据库·postgresql
AC赳赳老秦3 小时前
OpenClaw与WPS宏联动:批量执行WPS复杂操作,解决办公表格批量处理难题
java·前端·数据库·自动化·需求分析·deepseek·openclaw
源远流长jerry4 小时前
Linux 网络虚拟化深度解析:从 veth 设备对到容器网络实战
linux·运维·服务器·网络·性能优化·php
杜子不疼.4 小时前
用 JiuwenSwarm 搭建 SRE 智能值班体系:告警分级、根因分析与应急手册生成
数据库
接着奏乐接着舞4 小时前
java 数据结构
数据库·redis·缓存