Ubuntu 环境下的 Oracle SQL 优化要点
一 基础与 SQL 编写
- 使用绑定变量替代拼接,减少硬解析与库缓存争用。
- 避免 *SELECT ,仅查询必要列,降低I/O与网络开销。
- 为高频过滤/连接列建立合适的索引(单列、复合、函数索引等),并定期清理无用索引以减少维护成本。
- 对大表按时间/业务键做分区表,配合分区裁剪提升扫描效率。
- 用 EXPLAIN PLAN、SQL Tuning Advisor 与 AWR/ADDM 定位高负载 SQL 与执行计划问题。
- 合理使用 物化视图 预计算聚合/连接,加速重复复杂查询;对 Top-N 查询可用 ROWNUM 物化中间结果。
- 在适当场景用 EXISTS/NOT EXISTS 替代 IN/NOT IN,减少不必要全表扫描。
- 批量删除全表数据时优先 TRUNCATE(DDL,不可回滚、速度快),事务性删除再考虑分批 DELETE + COMMIT。
二 内存与实例参数
- 合理规划 SGA(如 shared_pool、buffer_cache)与 PGA,避免 swap;确保 SGA_TARGET/PGA_AGGREGATE_TARGET 与内存容量匹配。
- 调整 LOG_BUFFER 与在线重做日志文件大小/数量,减少日志写入等待。
- 设置合理的最大进程数与会话数,避免连接风暴;使用连接池复用连接,降低握手与销毁开销。
- 启用 Automatic SQL Tuning(默认维护窗口每日运行),对 AWR Top SQL 自动调用 SQL Tuning Advisor 并生成/验证SQL 配置文件,在测试环境确认后再推广。
三 存储 I O 与 Ubuntu 系统层
- 使用 SSD/NVMe 或高性能阵列,分离 数据文件/重做日志/归档日志/临时表空间 到不同磁盘,降低争用。
- 选择高效文件系统(如 ext4/xfs)并优化挂载选项(如 noatime、barrier 合理设置),减少元数据与写放大。
- 调优 内核网络参数(如 TCP 队列、somaxconn)与资源限制(如 ulimit -n),保障高并发连接稳定。
- 关闭不必要的系统服务/守护进程,减少 CPU/内存/中断竞争。
四 并发 统计与维护
- 持续收集统计信息:如 EXEC DBMS_STATS.GATHER_SCHEMA_STATS(‘SCHEMA_NAME’);,保证优化器生成更优执行计划。
- 对大批量导入/转换启用并行处理(并行 DML/查询),显著缩短批处理时间。
- 配置合理的回滚段/UNDO 表空间大小,避免长事务导致 ORA-01555 与空间不足。
- 建立定期维护流程:备份、清理无用对象、重建/重组碎片化索引、归档历史数据。
五 监控 诊断与自动化
- 利用 ADDM 快速识别高负载 SQL 与等待事件,配合 AWR 做趋势与对比分析。
- 对问题 SQL 使用 SQL Tuning Advisor 获取索引/SQL 配置文件/重写等建议,先在测试库验证再实施。
- 启用 Automatic SQL Tuning 任务,按需强制执行并审查报告,逐步推广有效的SQL 配置文件。
- 使用 10046 事件跟踪收集会话级详细执行信息,定位难以复现的性能问题。