• 1. Oracle Sql性能优化
  • 2. 影响数据库性能的相关因素 1.商业需求对性能的影响 2.系统架构与实现对性能的影响 3.Query语句对系统性能的影响 4.schema设计对系统的性能影响 5.硬件环境对系统性能的影响
  • 3. 1基本原则 不要幻想应用与数据库无关,除非对每种数据库的体系结构以及运行机制有深入的理解,否则很难开发出高性能以及可伸缩的应用。 不要把数据库当成一个黑盒子,要尽量使用相应数据库提供的功能。 对于SQL语句的优化占Oracle Server优化任务的80%以上。 当开发一个新功能时候(有业务逻辑除外)
  • 4. 1.如果可能的话,尽量在单条SQL语句里完成。 2.如果单条SQL不能完成,尽量在PL/SQL存储过程中完成。 3.如果PL/SQL不能完成,尽量在JAVA存储过程里完成。
  • 5. 2.SQL书写基本原则 1>简化业务逻辑。 2>OLTP中使用绑定变量。 3>书写规范、统一。 4>避免隐式数据类型转换,减少对索引列的数据类型转换。 5>减少“select *”的使用 6>用exists代替in,除非in子查询里面的记录数相对很少。
  • 6. 7>用not exists代替not in,除非in子查询里面的记录数相对很少。 8>减少distincat、trim的使用。 9>需要返回超过表中30%记录数的时候,使用索引不会有明显的性能改善。 10>用>=(<=)代替>(<)。 11>避免在索引列上使用函数。 12>索引列尽量少采用 like ‘%abc’,而用like ‘abc%’。 13>尽量用union(如果允许,尽量用union all)代替OR。
  • 7. 14>在需要使用的索引列上避免使用is null 、is not null 、<>。 15>复合索引中,尽量使用前导列(索引第一列)。 16>使用索引的时候,考虑使用ROWID。
  • 8. 3.关于并行控制 并行控制是数据库之间相互区别的主要标志。也是数据库区别于文件系统的一个重要方面。如果掌握了数据库的并行机制,那么在处理连续请求时,系统可以运行的很好。但当并发用户同时请求时,系统可能会出现以下问题: 1.数据完整性受到破坏。 2.即使是少量用户,运行速度也不快。 3.在多用户并发情况下,应用系统的可扩展性降低。
  • 9. 1>oracle的锁策略 1.当且仅当要修改数据时,oracle才会在行级上锁定数据,并且不会把锁定上升到表级。 2.oracle不会为读取面锁定数据,简单读取不会在行上产生锁(select for update除外) 3.对于行级锁(Row Level Lock)—我们平时常用到的oracle中的事务锁,行级锁没有开销: a. read不阻塞read
  • 10. b. read不阻塞write c. write不阻塞read d. write不阻塞write(不同行) 所以在oracle中,在高度并行环境又要保证数据的完整性的时候(eg:生成流水号),采用: a.select * for update锁定需要修改的行 b.根据前一步select的结果进行update c.commit/rollback释放所有锁 2>一致性读取 SCN和Rollback segment保证
  • 11. 4.SQL书写与调整步骤 1.研究、简化业务需求,确定必需访问的表。 2.了解相关表的结构,字段类型及表之间的关系。 3. 了解相关表上索引的情况。 4.了解相关字段的值的分布情况,如重复值等待。 5.研究查询需要返回的大致数据量范围,比如随着业务量的增长,查询效率可能会有变化。
  • 12. 6.大概估计一下执行计划,估计使用哪些索引以及是否需要新的索引。 7.写出SQL语句。 8.不断观察执行计划、调整SQL、直到和第六步中的预相差不多。 9.格式化SQL语句,使格式规范,易于阅读和软解析。
  • 13. 5.SQL调整实例