前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SQL优化

SQL优化

作者头像
一觉睡到小时候
发布2019-07-02 17:07:46
8480
发布2019-07-02 17:07:46
举报
文章被收录于专栏:国产程序员国产程序员

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数据类型的列不应该增加索引

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-05-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 国产程序员 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档