Oracle 数据库SQL优化指南


一、常见不走索引的情况

  1. 在 WHERE 子句中对索引列使用函数或表达式
    • 示例:SELECT * FROM employees WHERE UPPER(last_name) = 'SMITH';
    • 示例:SELECT * FROM employees WHERE salary * 1.1 > 5000;
      原因:函数或计算会导致索引失效。
  2. 对索引列进行隐式或显式类型转换
    • 示例:SELECT * FROM employees WHERE phone_number = 1234567;(phone_number 为字符串类型)
      原因:类型转换导致索引无法使用。
  3. 使用不等于操作符(<> 或 !=)
    • 示例:SELECT * FROM employees WHERE department_id <> 10;
  4. 使用前导通配符的 LIKE 查询
    • 不走索引:LIKE '%son' 或 LIKE '%son%'
    • 走索引:LIKE 'son%'
  5. 使用 IS NULL 或 IS NOT NULL
    注意:除非是位图索引或索引包含 NULL 值,否则通常不走索引。
  6. 使用 NOT IN
    建议:尽量改写为 NOT EXISTS 或其他等价形式。

二、避免创建重复索引性能瓶颈:

重复索引(如 idx1(col1,col2,col3)、idx2(col1)、idx3(col1,col2))会占用大量空间,并显著降低 DML 操作性能。优化方案:

分析索引使用情况,删除冗余索引,只保留最优的复合索引。


三、避免整个批量过程使用一个大事务性能瓶颈:

单个大事务提交时间长,异常时回滚耗时久,不支持断点续跑,容易影响联机业务。优化方案:

根据业务逻辑拆分成多个小事务,阶段性提交,支持断点续跑。


四、LOB 字段不能设置为 NOLOGGING性能瓶颈:

表设置为 NOLOGGING 时,LOB 对象也会跟随,导致并发环境下产生大量 enq: CF - contention 等待,严重影响性能。优化方案:

表和对应的 LOB 对象均设置为 LOGGING。


五、时间字段不建议使用 VARCHAR2/CHAR/NUMBER 类型性能瓶颈:

统计信息 LOW_VALUE 和 HIGH_VALUE 以 NUMBER 形式存储,导致执行计划估算偏差大,SQL 效率低下。优化方案:

统一使用 DATE 或 TIMESTAMP 类型。


六、大表建议进行分区分区优点:

  • 显著提升查询性能(分区剪枝)
  • 改善高并发插入性能(尤其是 Hash 分区)
  • 增强可用性(分区故障不影响其他分区)
  • 维护方便(快速清理历史数据)
  • 均衡 I/O

建议:表大小超过 10GB 或行数超过 1000万 时,建议进行分区。


七、Sequence 的最佳实践

  • CACHE SIZE:高并发场景建议调大(默认 20 太小),避免频繁更新数据字典。

  • ORDER Flag:RAC 环境下建议保持 NOORDER,避免 enq: SV - contention。

  • Keep 在内存中(可选):sql

    复制代码
    EXEC DBMS_SHARED_POOL.KEEP('SCHEMA.SEQUENCE_NAME', 'Q');

八、不建议使用触发器实现基础数据操作性能瓶颈:

增加 SQL 与 PL/SQL 引擎切换开销,业务逻辑分散,维护困难,迁移风险高。优化建议:

基础数据操作逻辑尽量放在应用层实现。


九、避免创建带限制视图合并的视图性能瓶颈:

包含 UNION/UNION ALL/INTERSECT/MINUS/CONNECT BY/ROWNUM 的视图无法进行视图合并,导致 SQL 效率低下。优化建议:视图定义中尽量避免上述语法。


十、绑定变量的正确使用使用场景(推荐绑定变量):

  • 过滤条件值变化非常多(如账号、姓名、订单号等)
  • SQL 执行频率高

不使用绑定变量场景:

  • 过滤条件值很少且分布不均衡(如性别、状态、类型等)

十一、OLTP 系统避免使用位图索引性能瓶颈:

位图索引锁粒度大,高并发下容易产生大量行锁和死锁。优化建议:OLTP 表一律不使用位图索引。


十二、避免一次性 DELETE 大量数据后 COMMIT性能瓶颈:

会导致后续 INSERT 性能急剧下降(Bitmap Block 维护问题)。优化方案:

分批 DELETE + 多次 COMMIT,建议在业务低峰期执行。


十三、分区表 TRUNCATE/DROP 分区需注意全局索引问题:操作后全局索引会失效。

复制代码
ALTER TABLE table_name TRUNCATE PARTITION p1 UPDATE GLOBAL INDEXES;

十四、控制类似流水号的生成规则性能瓶颈:

单调递增的序列 + 索引会导致热点块竞争。

优化建议:采用前缀 + 随机序列等方式,避免单向递增。


十五、注意表和索引的默认并行度性能瓶颈:

默认并行度 > 1 时,全表扫描和索引快速全扫描都会并行,消耗大量 CPU 和 IO。优化建议:sql

复制代码
ALTER TABLE t1 PARALLEL 1;
ALTER INDEX idx1 NOPARALLEL;
相关推荐
AllData公司负责人2 小时前
AI大模型数据开发底座系列说明书,AllData集成Chat2DB开源项目建设AI 数据库分析底座,涵盖AI 洞察/对话SQL/智能视图!
数据库·人工智能·sql·开源·ai 洞察·对话sql
xixingzhe23 小时前
数据库备份的分类与特点
数据库
时间的拾荒人6 小时前
Redis 主从复制详解:配置实操 + 原理机制
数据库·redis·面试
隔窗听雨眠7 小时前
MySQL三表JOIN执行内核与优化器决策机制
数据库·mysql·sql优化
Decay__8 小时前
SQLServer 索引与 SQL 优化 —— 聚集索引、非聚集索引、覆盖索引、碎片维护与执行计划
运维·数据库·sql·mysql·架构
笃行3509 小时前
【金仓数据库产品体验官】订单增量同步实战:MERGE、OUTPUT 与 IDENTITY 的兼容验证
数据库
星恒随风12 小时前
MySQL 从零入门(六):复合查询详解——多表查询、自连接、子查询与 UNION
linux·服务器·数据库·mysql
无奈笑天下13 小时前
银河麒麟上lsblk命令教程详解
linux·运维·服务器·数据库
xiaoye-duck15 小时前
《C++ 项目:手写大模型接入 SDK》会话模块整合:内存 SessionManager 与 DataManager 持久化联动
开发语言·数据库·c++·语言模型
AllData公司负责人15 小时前
AI大模型数据开发底座系列说明书:AllData集成DB-GPT开源项目建设 AI 多模态分析底座,涵盖模态解析/智能大屏/MCP 扩展!
大数据·数据库·人工智能·gpt·数据采集·数据接入·模态解析