新人笔记—oracle存储过程调优篇,欢迎各位大佬来补充
–1–建立索引 create index index1 table_name(colum) 首要对于一些经常用于连接的表,表的列数较多,数量较大,可根据连接条件选择合适的索引
but :全表扫描:这种方式会读取表中的每一条记录,顺序地读取每一个数据块直到结尾标志,对于一个大的数据表来说,使用全表扫描会降低性能,但有些时候,比如查询的结果占全表的数据量的比例比较高时,全表扫描相对于索引选择又是一种较好的办法。
–2–统一规范
oracle在执行一条SQL语句时,总是会先从共享内存区中查找相同的sql语句,但是由于oracle只对简单表进行缓存,因此对于多表连接查询并不适用.
SELECT * FROM EMP;
SELECT * from EMP;
Select * from Emp;
SELECT * FROM EMP;
比如在PL/SQL语句中的游标执行SQL语句,如果oracle检测到它和以前已运行过的语句相同,就会使用已经被解析的语句,使用最优的执行路径.
所以,建议都采取大写方式,使要处理的语句与共享池中的相一致,有助于运行性能的提高.
–3–执行计划的理解, 可用于查看是否运用了索引查询
当执行一个sql语句时oracle经过了4个步骤:
解析sql语句:主要在共享池中查询相同的sql语句,检查安全性和sql语法与语义。
创建执行计划及执行:包括创建sql语句的执行计划及对表数据的实际获取。
显示结果集:对字段数据执行所有必要的排序,转换和重新格式化。
转换字段数据:对已通过内置函数进行转换的字段进行重新格式化处理和转换.
–4–连接查询的表顺序 用小表驱动大表,性能更高,区别很大
–5–指定where条件顺序 oracle采用自下而上的顺序解析where子句,因此在处理多表查询时,表之间的连接必须写在其他的where条件之前,但是过滤数据记录的条件则必须写在where子句的尾部,以便在过滤了数据之后再进行连接处理,这样可以提升sql语句的性能。
–6–避免低效的PL/SQL流程控制语句 短路径的计算方式 通俗来讲就是,如果前一个判断语句不生效,则下一个就不会执行。所以要把开销小的放在前面
example:if (v > 5000 ) OR (job = ‘1’) 倘若v<5000 则不会进行job的判断
–7–简单表查询用exist代替in 因为in实际上它对子查询中的表执行了一次全表扫描