Oracle 网络性能优化

Oracle 网络性能优化

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


1. 概述

Oracle 网络性能影响客户端连接[1]:

关键组件

  • Listener
  • SQL*Net
  • SDU/ TDU
  • 连接池

2. Listener 优化

2.1 查看

lsnrctl status

2.2 多 Listener

# listener.ora
LISTENER1 = (ADDRESS=(PROTOCOL=tcp)(HOST=node1)(PORT=1521))
LISTENER2 = (ADDRESS=(PROTOCOL=tcp)(HOST=node1)(PORT=1522))

2.3 队列大小

# listener.ora
LISTENER = 
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = tcp)(HOST = node1)(PORT = 1521)
       (QUEUESIZE = 100))
    )
  )

3. SDU / TDU

3.1 SDU(Session Data Unit)

# sqlnet.ora
DEFAULT_SDU_SIZE = 32767

# listener.ora
SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SDU = 32767)
      (SID_NAME = orcl)
    )
  )

# tnsnames.ora
ORCL = 
  (DESCRIPTION =
    (SDU = 32767)
    (ADDRESS = ...)
    (CONNECT_DATA = ...)
  )

3.2 优势

  • 减少网络往返
  • 大数据传输快
  • 默认 8KB,推荐 32KB

4. 连接池

4.1 DRCP

-- 启用
ALTER SYSTEM SET shared_servers = 10;
ALTER SYSTEM SET max_shared_servers = 50;

4.2 客户端

# tnsnames.ora
ORCL = 
  (DESCRIPTION =
    (ADDRESS = ...)
    (CONNECT_DATA = 
      (SERVICE_NAME = orcl)
      (SERVER = SHARED)
    )
  )

4.3 优势

  • 减少服务器进程
  • 支持大量连接
  • 资源节省

详细见:Oracle 网络架构与监听器配置


5. 网络等待事件

5.1 关键事件

SQL*Net message from client
SQL*Net message to client
SQL*Net more data from client
SQL*Net more data to client
SQL*Net break/reset to client

5.2 查看

SELECT 
  event,
  total_waits,
  time_waited,
  average_wait
FROM v$system_event
WHERE event LIKE 'SQL*Net%'
ORDER BY time_waited DESC;

5.3 分析

  • SQL*Net message from client:等待客户端,Idle
  • SQL*Net more data to client:大量数据传输

6. 优化策略

6.1 减少 SQL*Net 往返

-- 1. Array Fetch(PL/SQL)
FETCH c BULK COLLECT INTO v LIMIT 100;

-- 2. 批量操作
FORALL i IN 1..v.COUNT
  INSERT INTO ...;

-- 3. 减少网络调用
-- 单次 SQL 多行

6.2 大 SDU

DEFAULT_SDU_SIZE = 32767

6.3 连接复用

-- 连接池
-- 应用层

6.4 本地连接

-- BEQ 协议(本地)
-- 比 TCP 快

7. 网络加密性能

7.1 Native Encryption

# sqlnet.ora
SQLNET.ENCRYPTION_SERVER = REQUIRED
SQLNET.ENCRYPTION_TYPES_SERVER = (AES256)

7.2 性能影响

  • 加密开销
  • CPU 使用

7.3 优化

  • 高效算法(AES)
  • 硬件加速
  • 仅敏感数据加密

8. 连接建立优化

8.1 减少解析时间

# sqlnet.ora
SQLNET.INBOUND_CONNECT_TIMEOUT = 60

8.2 预连接

  • 应用连接池
  • 减少握手

8.3 缓存

# sqlnet.ora
NAMES.DIRECTORY_PATH = (TNSNAMES, EZCONNECT)

9. 远程数据库

CREATE DATABASE LINK remote_db 
  CONNECT TO user IDENTIFIED BY ****** 
  USING 'remote_db';

9.2 优化

-- 1. 减少远程调用
-- 2. 批量传输
-- 3. 物化视图

10. 监控

10.1 网络流量

SELECT 
  event,
  total_waits,
  time_waited
FROM v$system_event
WHERE event LIKE 'SQL*Net%';

10.2 Listener 日志

tail -f $ORACLE_HOME/network/log/listener.log

10.3 OS 监控

# 网络流量
sar -n DEV 1

# 延迟
ping server
traceroute server

11. 常见坑与排错

11.1 客户端慢

1. 网络延迟
2. DNS 解析
3. 防火墙
4. Listener 队列

11.2 连接拒绝

ORA-12520: TNS:listener could not find available handler
-- 1. 增加 PROCESSES
-- 2. DRCP
-- 3. 连接池

11.3 大数据传输慢

1. 增大 SDU
2. 批量操作
3. 网络带宽

12. 最佳实践

  1. 大 SDU:32KB
  2. Array Fetch:减少往返
  3. 连接池:复用
  4. DRCP:大量连接
  5. BEQ 本地:快
  6. 加密平衡:性能/安全
  7. 监控 SQL*Net:性能
  8. DNS 缓存:解析
  9. 多 Listener:负载
  10. 网络硬件:基础

13. 参考资料

[1] Oracle Database Net Services Administrator’s Guide 19c https://docs.oracle.com/en/database/oracle/oracle-database/19/netag/