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. 数据充足:1-4 周
  2. 业务正常:避免异常
  3. 多时段基线:高峰/低峰
  4. 重复基线:每周自动
  5. 关键业务监控:响应时间
  6. 定期更新:每月
  7. 业务变更后更新:准确
  8. 对比报告:异常分析
  9. 基线 + ASH:实时
  10. 文档化:维护

15. 参考资料

[1] Oracle Database Performance Tuning Guide 19c, “Baselines” https://docs.oracle.com/en/database/oracle/oracle-database/19/tgdba/automatic-workload-repository.html