Oracle中SQL性能优化
一:函数使用会造成效率上的不同
decode函数相当于case when 但是decode从效率上来讲是强于case when的,但是从个人使用的角度来说case when的使用可以更加多样化,这一点强于decode,两者的选择还是从现实中抉择。
删除数据的角度来说,可以使用 truncate和delete和drop,从效率来说truncate最快,这是将数据对应的表空间都直接删除了,delete只是删除数据,并未删除表空间,drop虽然也能达到删除数据的效果,不过将会把表都一起删除。
删除语句慎用!!!!!
执行完删除语句最后删除或是注释,否则一个失误将会造成严重后果!!
二:in、not in 和exists、not exists效率上的不同
如果查询的两个表大小差不多,那么用in和exists差别不大;如果两个表中一个较小一个较大,则子查询表比主表大的用exists,子查询表比主表小的用in
如果查询语句使用了not in,那么对内外表都进行全表扫描,没有用到索引;而not exists的子查询依然能用到表上的索引。所以无论哪个表大,用not exists都比not in 要快
三:SQL语句的规范性也会造成效率的不同
在oracle中执行SQL,总是会先解析SQL,会将小写字母转换成大写字母,所以我们写SQL的时候,可以的话都大写,但是这又会降低可读性,因为大家一般都是认小写的英文比较多,这个就看个人情况使用了。
带有DISTINCT,UNION,MINUS,INTERSECT,ORDERBY 的SQL语句,会对效率产生很大影响,尤其是distinct需要注意。
及时清理表空间,对无用的临时表(数据较大)进行及时的清楚
四:全表扫描造成的影响
尽可能的避免全表扫描,如果一定要的话,根据表数据量的大小,选择是否在关键字段加上索引,这里的关键字段一般选择在where条件语句中用到的字段和order by排序中用到的字段。
where 语句中出现 != 或 <>都会放弃使用索引,直接进行全表扫描,慎用!
如果出现or,如有一个没有索引,那么执行的时候都会放弃使用索引,如果条件允许写成union all
模糊搜索’%%'也会造成全表扫描,这可能是无可避免的
在where语句中如果对字段进行函数操作,也会使索引失效
索引不可以随意加,虽然对select效率会提高,但是会对update和insert语句造成影响,所以建索引的时候需慎重。
五:字符类型造成的影响
首先字符类型尽可能的选用可变类型varchar或是nvarchar,这样会在一定程度上节约数据库空间
然后如果字段内只含有数值类型或是浮点数,都不要用字符类型保存,这样会造成在查询时每个一个字段的每个字符都会被扫描,如果是数值类型就只扫描一次。
六:视图
视图虽然会在一定程度上降低我们的工作量,节约很多时间,但是视图的执行也是会消耗数据库资源的,查询视图时,如果数据量较大也会很慢,所以当SQL中出现了视图,就小心使用视图。
七:可读性
查询时拒绝复杂SQL,SQL虽没有编程语言复杂同时也需很高的可读性,如果不是一定要多重嵌套,那么我们都会选择多建临时表。
尽可能的不要写select * ,这样会很消耗资源,还有就是多加条件查询,会降低查询时间
多写注释,便于二次开发及别人阅读
八:并发
如果在SQL优化上已经没有可改的情况下,可以选择加并发提高SQL执行效率,如有需要自行百度,这里就不多加赘述。