Oracle 性能基线建立
Oracle 性能基线建立
适用版本:Oracle Database 11g / 12c / 19c / 23ai 文档版本:v1.0 / 2026-07
1. 概述
性能基线是性能评估基础[1]:
作用:
- 正常性能标准
- 异常检测
- 容量规划
- SLA 评估
2. 基线指标
2.1 关键指标
| 类别 | 指标 |
|---|---|
| 响应时间 | SQL 平均响应时间 |
| 吞吐量 | TPS、QPS |
| 资源使用 | CPU、内存、I/O |
| 命中率 | Buffer、Library |
| 等待 | Top wait events |
2.2 AWR 基线
-- 创建基线
EXEC DBMS_WORKLOAD_REPOSITORY.CREATE_BASELINE(
start_snap_id => 100,
end_snap_id => 110,
baseline_name => 'normal_perf'
);
-- 模板
EXEC DBMS_WORKLOAD_REPOSITORY.CREATE_BASELINE_TEMPLATE(
template_name => 'weekly_template',
template_type => 'REPEATING',
day_of_week => 'MONDAY',
hour_in_day => 9
);
3. 建立基线
3.1 收集周期
- 业务正常期:1-4 周
- 高峰期:1-2 周
- 低峰期:1 周
3.2 数据来源
1. AWR 快照
2. ASH 采样
3. OS 监控(top, iostat)
4. 业务监控
3.3 基线类型
- 单次基线
- 重复基线(每周、每月)
4. 性能指标基线
4.1 响应时间
-- 平均 SQL 响应时间
SELECT
AVG(elapsed_time / 1000000 / NULLIF(executions, 0)) AS avg_sec
FROM v$sql
WHERE executions > 0;
4.2 吞吐量
-- TPS
SELECT
metric_name,
value
FROM v$sysmetric
WHERE metric_name IN ('User Commits Per Sec', 'User Rollbacks Per Sec');
4.3 AAS
SELECT
metric_name,
value
FROM v$sysmetric
WHERE metric_name = 'Average Active Sessions';
5. 资源基线
5.1 CPU
-- CPU 使用
SELECT
metric_name,
value
FROM v$sysmetric
WHERE metric_name LIKE 'CPU%';
5.2 内存
SELECT
name,
value / 1024 / 1024 AS mb
FROM v$sgainfo;
5.3 I/O
SELECT
metric_name,
value
FROM v$sysmetric
WHERE metric_name LIKE '%I/O%' OR metric_name LIKE 'Physical%';
6. 命中率基线
6.1 Buffer Cache
SELECT
1 - SUM(decode(name, 'physical reads cache', value, 0)) /
NULLIF(SUM(decode(name, 'consistent gets from cache', value, 0) +
decode(name, 'db block gets from cache', value, 0)), 0)
AS hit_ratio
FROM v$sysstat
WHERE name IN ('physical reads cache', 'consistent gets from cache', 'db block gets from cache');
6.2 Library Cache
SELECT SUM(gets - getmisses) / NULLIF(SUM(gets), 0) AS lib_hit
FROM v$librarycache;
6.3 Sort
SELECT
SUM(decode(name, 'sorts (memory)', value, 0)) /
NULLIF(SUM(decode(name, 'sorts (memory)', value, 'sorts (disk)', value, 0)), 0)
FROM v$sysstat
WHERE name IN ('sorts (memory)', 'sorts (disk)');
7. 等待事件基线
7.1 Top 等待
SELECT
event,
total_waits,
time_waited,
average_wait
FROM v$system_event
WHERE wait_class != 'Idle'
ORDER BY time_waited DESC
FETCH FIRST 5 ROWS ONLY;
7.2 等待分类
SELECT
wait_class,
SUM(time_waited) AS total
FROM v$system_event
WHERE wait_class != 'Idle'
GROUP BY wait_class
ORDER BY total DESC;
8. 基线对比
8.1 AWR 对比报告
@?/rdbms/admin/awrddrpt.sql
8.2 基线对比
-- 基线
SELECT baseline_name FROM dba_hist_baseline;
-- 移除
EXEC DBMS_WORKLOAD_REPOSITORY.DROP_BASELINE(baseline_name => 'normal_perf');
9. 业务基线
9.1 关键业务
- 用户登录响应
- 订单创建时间
- 报表生成时间
- 关键查询响应
9.2 监控
-- 业务 SQL 性能
SELECT
snap_id,
sql_id,
elapsed_time_total / 1000000 AS sec
FROM dba_hist_sqlstat
WHERE sql_id IN ('&sql1', '&sql2', '&sql3')
ORDER BY snap_id;
10. 容量基线
10.1 数据增长
-- 历史快照
SELECT
snap_id,
ROUND(SUM(tablespace_size * 8 / 1024 / 1024), 2) AS gb
FROM dba_hist_tbspc_space_usage
GROUP BY snap_id
ORDER BY snap_id;
10.2 用户增长
SELECT COUNT(*) FROM dba_users WHERE account_status = 'OPEN';
10.3 业务量
-- 每日事务
SELECT
TO_CHAR(begin_time, 'YYYY-MM-DD') AS day,
ROUND(SUM(metrics_value)) AS txn_count
FROM dba_hist_sysmetric_summary
WHERE metric_name = 'User Commits Per Sec'
GROUP BY TO_CHAR(begin_time, 'YYYY-MM-DD')
ORDER BY day DESC;
11. 基线应用
11.1 异常检测
当前性能 vs 基线
- 响应时间 > 2x 基线:异常
- AAS > 1.5x 基线:高负载
- 命中率 < 95% 基线:问题
11.2 容量规划
当前 + 增长率
未来需求 vs 容量
扩容时机
11.3 SLA 评估
基线响应时间
当前响应时间
SLA 达成率
12. 基线维护
12.1 定期更新
- 每月更新
- 业务变更后
- 硬件升级后
12.2 版本管理
- 基线版本
- 变更记录
13. 常见坑与排错
13.1 基线不准
- 数据不足
- 业务变化
- 异常时段
13.2 基线过期
- 数据增长
- 业务变化
- 硬件升级
14. 最佳实践
- 数据充足:1-4 周
- 业务正常:避免异常
- 多时段基线:高峰/低峰
- 重复基线:每周自动
- 关键业务监控:响应时间
- 定期更新:每月
- 业务变更后更新:准确
- 对比报告:异常分析
- 基线 + ASH:实时
- 文档化:维护
15. 参考资料
[1] Oracle Database Performance Tuning Guide 19c, “Baselines” https://docs.oracle.com/en/database/oracle/oracle-database/19/tgdba/automatic-workload-repository.html