Oracle OLTP 性能优化

Oracle OLTP 性能优化

适用版本:Oracle Database 11g / 12c / 19c / 23ai 文档版本:v1.0 / 2026-07


1. 概述

OLTP 场景性能优化[1]:

特点

  • 高并发
  • 短事务
  • 频繁查询
  • 数据一致性

2. 索引优化

2.1 关键索引

-- 主键
CREATE TABLE orders (
  id NUMBER PRIMARY KEY,
  ...
);

-- 外键
CREATE INDEX idx_orders_cust ON orders(customer_id);

-- 查询常用列
CREATE INDEX idx_orders_status_date ON orders(status, create_date);

2.2 复合索引

-- 高选择性在前
CREATE INDEX idx_emp_dept_sal ON employees(dept_id, salary);

2.3 函数索引

CREATE INDEX idx_emp_upper_name ON employees(UPPER(name));

详细见:Oracle 索引优化策略


3. 内存优化

3.1 Buffer Cache

ALTER SYSTEM SET db_cache_size = 32G;
-- OLTP 命中率 > 95%

3.2 Shared Pool

ALTER SYSTEM SET shared_pool_size = 8G;
-- 绑定变量减少解析

3.3 KEEP Pool

ALTER SYSTEM SET db_keep_cache_size = 4G;

ALTER TABLE small_hot_table STORAGE (BUFFER_POOL KEEP);

3.4 Redo Log Buffer

ALTER SYSTEM SET log_buffer = 67108864 SCOPE=SPFILE;  -- 64M

4. 并发优化

4.1 序列

-- RAC NOORDER
CREATE SEQUENCE seq_emp NOORDER CACHE 1000;

4.2 INITRANS

-- 高并发
CREATE TABLE ... INITRANS 20;
ALTER TABLE ... INITRANS 20;

4.3 PCTFREE

-- 减少 HOT Block 迁移
CREATE TABLE ... PCTFREE 20;

5. 事务优化

5.1 短事务

- 及时 COMMIT
- 减少锁持有
- 避免长事务

5.2 批量

-- BULK COLLECT + FORALL
FORALL i IN 1..v.COUNT
  INSERT INTO ... VALUES v(i);

5.3 异步处理

- 队列
- 后台任务
- 减少响应时间

6. 锁优化

6.1 减少锁等待

-- 1. 及时提交
-- 2. 优化 SQL 速度
-- 3. 调整事务顺序

6.2 死锁预防

-- 1. 固定表更新顺序
-- 2. 减少 ITL 等待
-- 3. 索引减少全表锁

详细见:Oracle 锁等待深度分析


7. 解析优化

7.1 绑定变量

EXECUTE IMMEDIATE 'SELECT * FROM emp WHERE id = :1' USING v_id;

7.2 CURSOR_SHARING

ALTER SYSTEM SET cursor_sharing = EXACT;  -- 推荐
-- 或 FORCE(应用不能改)

7.3 监控

SELECT name, value FROM v$sysstat 
WHERE name IN ('parse count (hard)', 'parse count (total)');
-- hard / total < 5%

8. I/O 优化

8.1 SSD

- 数据文件 SSD
- Redo SSD
- 索引 SSD

8.2 Redo 分离

ALTER DATABASE ADD LOGFILE GROUP 1 
  ('/redo1/redo01a.log', '/redo2/redo01b.log') SIZE 2G;

8.3 ASM

多磁盘组
AU 4M

详细见:Oracle 数据库 I/O 优化


9. RAC 优化

9.1 服务分离

srvctl add service -db orcl -service oltp_svc -preferred orcl1

9.2 减少 Cache Fusion

- 业务分布
- 数据分布
- 序列 NOORDER

详细见:Oracle RAC 性能调优


10. 连接池

10.1 应用连接池

- HikariCP
- Druid
- UCP

10.2 DRCP

EXEC DBMS_CONNECTION_POOL.START_POOL;

详细见:Oracle 数据库连接池优化


11. 监控

11.1 关键指标

- TPS
- 响应时间
- AAS
- 锁等待
- 命中率
- CPU
- I/O

11.2 AWR

-- AWR 报告
@?/rdbms/admin/awrrpt.sql

12. 性能基线

- TPS:1000
- 响应:50ms
- 命中率:98%
- 锁等待:< 1s

详细见:Oracle 性能基线建立


13. 常见问题

13.1 锁等待多

- 应用提交不及时
- 长事务
- SQL 慢

13.2 解析高

- 无绑定变量
- 共享游标少

13.3 I/O 瓶颈

- 索引缺失
- 全表扫描

14. 最佳实践

  1. 索引完整:基础
  2. 绑定变量:减少解析
  3. 短事务:减少锁
  4. 大内存:减少 I/O
  5. KEEP Pool:热点
  6. 序列 NOORDER:RAC 友好
  7. 连接池:复用
  8. 服务分离:RAC
  9. 监控:及时
  10. 基线对比:异常

15. 参考资料

[1] Oracle Database Performance Tuning Guide 19c https://docs.oracle.com/en/database/oracle/oracle-database/19/tgdba/