SQL优化

SQL书写习惯

  • SQL语句尽量使用大写。

Oracle解析SQL语句时,会把小写的字母转换成大写的再执行。

例:select *from tempagreement where rownum<10;

SELECT * FROM TEMPAGREEMENT WHERE ROWNUM<10;

两句的查询相差0.5秒

  • 查询字段带别名。

如果为所查询的表起了别名,那么在查表中字段的时候要带上别名,可以减少解析时间

例:SELECTC.C_CODE FROM CITY C

  • 查询表的顺序。

Oracle从右到左处理FROM子句中的表名,所以在FROM子句中包 含多个表的情况下,将记录最少的表放在最后。

  • WHERE语句条件的顺序。

例:SELECT * FROM TABLE1 T1, TABLE2 T2

WHERE T1.T_ID=T2.T_ID 表连接语句

AND T1.T=’Y’ 条件语句

从下至上的顺序

  • 相同查询要保持SQL相同。

包括字母的大小写、标点符号、换行的位置等都要一致

例:SELECT * FROM DUAL;

SELECT * FROM DUAL;

操作符的使用

EXISTS IN OR

NOT EXISTS NOT IN

执行IN子查询时,首先执行子查询,将查询结果放入临时表中再执行主查询

EXISTS则是首先检查主查询,然后运行子查询直到找到匹配项

例:

Select * from city c

Where exists(

select * from airport a where a.ap_code=c.city_code

)

Select * from city c

Where c.city_code in(

select * from airport a

);

GROUP BY DISTINCT

滤掉多余的重复记录只保留一条,但是执行效率极差

UNION与UNION ALL

有重复:UNION,筛选重复记录,再进行排序

无重复:UNION ALL,两个结果合并

LIKE

LIKE ‘%CA809%’ 不走索引

LIKE ‘%CA809’ 不走索引

LIKE ‘CA809%’ 走索引

“>=”和“<=” BETWEEN

使用BETWEEN,会先转换为“>=”和“<=”

ORDER BY

1)ORDER BY中所有列必须包含在相同的索引中,并保持在索引中的排列顺序。

2)ORDER BY中所有的列必须定义为非空。

GROUP BY

避免使用HAVING子句再次筛选。

索引的使用

索引是用来提高检索数据的效率,通过索引查询数据比全表扫描要快很多。

索引不足:

Ø 创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加

Ø 索引需要占物理空间

Ø 当对表中的数据进行增加、删除和修改的时候,索引也会动态维护,这样就降低了数据更的速度

索引的限制:

Ø 避免在索引列上使用NOT。当Oracle遇到NOT时,他会停止使用索引转而执行全表扫描。

例:where not time1 >=to_date(sysdate-1,’yyyymmdd’)

Ø 避免在索引列上使用计算。

例:Where time1>time2

Ø 避免在索引列上使用函数。

例:where trunc(time1,’dd’)

Ø 避免在索引列上使用ISNULL和IS NOT NULL,索引将会失效。

例:where time1 is null / where time1 is not null

Ø 避免在索引中使用任何可以为空的列,索引将会失效。

Ø 如果是组合索引,总是使用索引的第一列。只有第一列被WHERE子句引用时,优化器才会选择使用该索引。当仅引用索引的第二列时,优化器使用全表扫描而忽略了索引。

例:b_code,ta_id,sac_id 是联合索引,where ta_id=2

Ø 避免改变索引列的类型。

例:where to_char(time1,’yyyymmdd’)=‘20131010’

Ø 避免使用“<>”或者“!=”操作符

例:where time1<>trunc(sysdate,’dd’)

Ø 当通配符“%”或者“_”作为查询字符串的第一个字符时,索引不会被使用

例:where code like ‘%华北’ / where code like ‘_华北’

Ø 对于有连接的列“||”,最后一个连接列索引会无效

不应建索引的情况:

Ø 对于那些在查询中很少使用或者参考的列不应该创建索引

Ø 对于那些只有很少数据值的列也不应该增加索引

Ø 对于那些定义为blob数据类型的列不应该增加索引

Ø 当修改性能远远大于检索性能时,不应该创建索引

原文发布于微信公众号 - 国产程序员(Monday_lida)

原文发表时间:2018-05-30

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券