数据库SQL语句性能优化

匿名 (未验证) 提交于 2019-12-03 00:41:02

选择最有效率的表名顺序

 

WHERE子句中的连接顺序

 

SELECT子句中避免使用‘*‘

当你想在select子句中列出所有的column时,使用动态sql列引用‘‘是一个方便的方法,不幸的是,这是一个非常低效的方法。 实际上,oracle在解析的过程中,会将‘‘依次转换成所有的列名。这个工作是通过查询数据字典完成的,这意味着将耗费更多的时间。

字符型字段必须加单引号

 

减少访问数据库的次数

 

ARRAYSIZE参数设置

 

使用DECODE函数可以避免重复扫描相同记录或重复连接相同的表

 

你可以用decode函数高效地得到相同结果

 

‘x‘表示任何一个字段。类似的,decode函数也可以运用于group by和order by子句中。

整合简单,无关联的数据库访问

如果你有几个简单的数据库查询语句,你可以把它们整合到一个查询中(即使它们之间没有关系),相同语句书写,同一功能同一性能不同写法SQL的影响,如:

 

四个SQL在ORACLE分析整理后产生的结果及执行的时间是一样的,但从ORACLE共享内存的原理,可以看出ORACLE对每一个SQL进行了一次解析,并且独立的占用共享内存,如果将SQL完全相同的格式,ORACLE只解析一次,共享内存只保留一次分析结果,这样不仅可以减少解析SQL的时间,而且可以减少共享内存里的重复信息。

删除重复记录

 

用TRUNCATE替代DELETE

 

尽量多使用COMMIT

 

用where子句替换having子句

 

减少对表的查询

 

通过内部函数提高SQL效率

 

使用表的别名(Alias)

 

用表连接替换exists

 
 

用EXISTS替换DISTINCT

 

sql语句用大写的

因为oracle总是先解析sql语句,把小写的字母转换成大写的再执行

避免在索引列上使用NOT

 

避免在索引列上使用计算

 

用>=替代> >

 

两者的区别在于, 前者DBMS将直接跳到第一个DEPT等于4的记录而后者将首先定位到DEPTNO=3的记录并且向前扫描到第一个DEPT大于3的记录.

用UNION替换OR (适用于索引列)

 

用IN来替换OR

 

避免在索引列上使用IS NULL和IS NOT NULL

 

如果索引是建立在多个列上, 只有在它的第一个列(leading column)被where子句引用时,优化器才会选择使用该索引. 这也是一条简单而重要的规则,当仅引用索引的第二个列时,优化器使用了全表扫描而忽略了索引。对于复合索引,在查询使用时,最好将where条件顺序按照索引的顺序,这样效率最高,如: 创建复合索引:

 

用UNION-ALL 替换UNION (如果有可能的话)

 

用WHERE替代ORDER BY

 

避免改变索引列的类型

 

需要当心的WHERE子句

 

索引注意事项

 

避免使用耗费资源的操作.

 

优化GROUP BY

 

模糊查询

使用instr()函数替换like模糊查询: instr(eqp.equipment_code,#{eqpNo})>0

原文:https://www.cnblogs.com/xyhero/p/d1624a75e7386ef175a90e96e246d65a.html

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!