优化sql语句
方法/步骤
-
统一SQL语句的写法
对于以下两句SQL语句,程序员认为是相同的,数据库查询优化器认为是不同的。
select * from dual
select * From dual
其实就是大小写不同,查询分析器就认为是两句不同的SQL语句,必须进行两次解析。生成2个执行计划。
所以作为程序员,应该保证相同的查询语句在任何地方都一致,多一个空格都不行!
-
Select子句中避免使用‘*‘
Oracle在解析的过程中,会将'*'依次转换成所有的列名,这个工作是通过查询数据字典完成的,这意味着将耗费更多的时间
-
避免在索引列上使用函数或计算,在where字句中,如果索引是函数的一部分,优化器将不再使用索引,将使用全表扫描;例如:
select * from table where hh*10>1000;//低效
select * from table where hh>1000/10;//更高效 -
尽量避免在索引列上使用not,!=和<>,索引只能告诉什么在表中,而不能告诉什么不在表中,当数据库遇上以上几种符号时,将不再使用索引,使用全表扫描
-
使用like进行模糊查询时应注意,有的时候会需要进行一些模糊查询比如
select * from contact where username like ‘%yue%’
关键词%yue%,由于yue前面用到了“%”,因此该查询必然走全表扫描,除非必要,否则不要在关键词前加%,
-
不要把SQL语句写得太复杂
一般,将一个Select语句的结果作为子集,然后从该子集中再进行查询,这种一层嵌套语句还是比较常见的,但是根据经验,超过3层嵌套,查询优化器就很容易给出错误的执行计划。因为它被绕晕了。像这种类似人工智能的东西,终究比人的分辨力要差些,如果人都看晕了,我可以保证数据库也会晕的。
-
oracle采用自下而上的顺序解析where字句,所以表之间的链接必须写在其他where条件之前,那些可以滤过大量纪录的条件必须写在where字句的末尾
-
sql语句用大写的;因为oracle总是先解析sql语句,把小写的字母转换成大写的再执行
END
文章评论