文章目录
-
- 达梦数据库(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优化案例)
-
- [案例1:禁止SELECT *](#案例1:禁止SELECT *)
- 案例2:IN子查询改JOIN
- 案例3:LIKE查询优化
- 案例4:批量操作优化
- 四、架构优化策略
-
- [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)
- SQL解析与优化:词法/语法/语义分析、生成执行计划、查询重写、成本优化、自适应优化
- 事务管理:支持ACID事务、隔离级别控制、并发控制、MVCC、分布式事务、锁管理、死锁检测
- 存储引擎:数据存储、索引管理、空间分配与回收,支持行存储、列存储、分区表、数据压缩、闪回技术
- 缓存管理:管理数据缓存池,采用LRU算法优化内存、减少磁盘I/O,含数据缓存、自适应缓存、查询缓存、多级缓存
存储管理层(Storage Management Layer)
- 文件系统管理:管理数据库/日志/控制文件,处理文件创建、扩展、空间分配回收;含表空间、数据文件、在线重组
- 重做日志管理:记录所有数据修改,支撑故障恢复、数据持久性、日志归档;支持组提交、并行日志、闪回日志
- 备份恢复管理:全量备份、增量备份、日志备份、在线热备、灾难恢复、时间点恢复、块级恢复,保障数据安全
核心组件:应用接口组件、SQL处理组件、事务管理组件、存储引擎组件、文件管理组件
一、性能优化概述
1.1 优化目标
- 提升吞吐量:提高QPS(每秒查询数)和TPS(每秒事务数)
- 降低响应时间:减少SQL执行时间和事务响应时间
- 提高资源利用率:优化CPU、内存、IO等资源使用
- 保障系统稳定性:避免性能瓶颈引发系统故障
1.2 优化原则
- 系统性原则:从整体架构到具体参数,系统化优化
- 数据驱动原则:基于监控数据和性能指标开展优化
- 渐进式原则:逐步优化,每次调整后验证效果
- 业务优先原则:优化不影响业务功能与数据一致性
- 可回滚原则:重要变更提前制定回滚方案
1.3 优化策略
性能优化策略
├── 性能分析
│ ├── 性能指标收集
│ ├── 瓶颈识别
│ └── 根因分析
├── 优化策略制定
│ ├── 架构优化
│ ├── SQL优化
│ ├── 参数调优
│ └── 硬件优化
├── 优化实施
│ ├── 测试环境验证
│ ├── 生产环境实施
│ └── 效果监控
└── 持续优化
├── 性能基线建立
├── 定期评估
└── 优化迭代
二、性能分析诊断流程
2.1 性能问题识别
2.1.1 性能指标监控(KPI查询SQL)
- 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);
- 响应时间分布
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;
- 缓冲池命中率
sql
SELECT
POOL_ID,
ROUND((1- DISK_READS /NULLIF(TOTAL_READS, 0)) *100, 2) AS HIT_RATE
FROM V$BUFFERPOOL
WHERE TOTAL_READS >0;
- 锁等待情况
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脚本
- 慢查询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;
- 会话资源消耗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优化原则
- 避免全表扫描,WHERE条件合理使用索引
- 按需查询字段,减少数据传输
- 优化JOIN类型与关联顺序
- 尽量用JOIN替代子查询
- 合理创建索引,避免索引冗余
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 执行计划优化要点
- 全表扫描(TABLE SCAN):大表禁止全表扫描,新建索引或优化WHERE条件
- 索引扫描(INDEX SCAN):保证索引选择性足够高
- 嵌套循环(NESTED LOOP):适合小表JOIN,内表必须建索引
- 哈希JOIN(HASH JOIN):适合大表JOIN,需充足内存
- 排序(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 表设计原则
- 规范化设计,减少数据冗余
- 超大表采用分区表
- 合理选择字段数据类型与长度
- 高频查询字段放在表字段靠前位置
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优化
- 选型
- OLTP:高主频CPU(>3.0GHz)
- OLAP:多核心CPU(>16核)
- CPU绑定
bash
taskset -cp 0-7 <PID>
6.2 内存优化
- 容量:最低16GB;推荐64GB-256GB;超大库512GB+
- 分配比例
- 操作系统预留:20%-30%
- 数据库缓冲池:60%-70%
- 其他进程:10%-20%
6.3 存储优化
- 磁盘选型
- 数据文件:SSD/NVMe SSD
- 日志文件:独立SSD
- 归档文件:SAS/SATA
- RAID配置
- 数据盘:RAID 10
- 日志盘:RAID 1
- 归档盘:RAID 5
- 文件系统 :Linux推荐ext4/xfs,挂载参数
noatime,nodiratime
6.4 网络优化
- 带宽:内网万兆、跨机房专线
- 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;
解决
- 新增索引:
CREATE INDEX IDX_COL ON TABLE_NAME(COLUMN_NAME); - 优化SQL:规避全表扫描、调整JOIN顺序、精简子查询
- 更新统计信息:
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;
解决
- 优化事务:缩短事务时长、减少锁持有、避免长事务
- 调整隔离级别:
ALTER SESSION SET ISOLATION_LEVEL = 1;(读已提交) - 优化索引:缩小锁范围、使用唯一索引
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;
解决
- 调大内存参数
sql
ALTER SYSTEM SET 'BUFFER' = <新值> SPFILE;
ALTER SYSTEM SET 'SORT_BUF_SIZE' = <新值> BOTH;
- 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;
解决
- SQL层面:加索引、减少全表扫描、优化JOIN
- 硬件升级:更换SSD、提升IO带宽
- 参数调优:
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%
优化措施
- 缓冲池BUFFER从500000扩容至1000000
- 缓冲池数量BUFFER_POOLS从1调至8
- 热点查询新增索引
- 调整连接池大小与超时参数
优化效果
- TPS提升至8000+
- 平均响应时间降至80ms
- 缓冲池命中率升至98%
- CPU使用率降至60%
案例2:大数据量OLAP系统优化
问题
- 复杂查询执行超30秒
- 排序频繁溢出磁盘
- 未启用并行查询
优化措施
- 开启并行查询:
PARALLEL_POLICY=1、MAX_PARALLEL_DEGREE=16 - 排序缓冲区SORT_BUF_SIZE 512调至2048
- 哈希缓冲区HASH_SIZE 10000调至50000
- 定期更新表统计信息
优化效果
- 查询耗时降至5-10秒
- 排序无磁盘溢出
- 并行查询资源利用率大幅提升
案例3:锁等待问题优化
问题
- 大量锁等待
- 事务响应慢
- 死锁频发
优化措施
- 隔离级别从可重复读改为读已提交
- 精简事务逻辑、缩短锁持有时间
- LOCK_TABLE从2000调至8000
- 热点表新增唯一索引
优化效果
- 锁等待减少90%
- 事务响应时间降低50%
- 死锁问题基本消除
十一、持续优化建议
- 搭建性能监控体系:实时采集KPI、配置告警、趋势分析
- 定期性能评估:每周输出性能报告、每月深度分析、季度整体优化复盘
- 性能基线常态化管理:固化基线指标、跟踪性能波动、及时识别性能退化