度量快速开发平台-专业、快速的软件定制快开平台

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 部件 流程 SQL
查看: 164|回复: 5

[分享] SQL书写注意事项

[复制链接]

231

主题

2541

帖子

5807

积分

论坛元老

Rank: 8Rank: 8

积分
5807
发表于 2018-3-23 17:58:33 | 显示全部楼层 |阅读模式
  1. 1、选择最优效的表名顺序(只在基于规则优的化器):大表在前,小表在后。
  2. 2、where子句的连接顺序:可以过滤掉更大数量记录的条件放在最后。
  3. 3、select子句避免使用“*”,因为Oracle解析过程中会将“*”一次转换成所有的列名,这部分属于额外消耗。
  4. 4、在SQL*Plus、SQL*Forms和Pro*C中重新设置ARRAYSIZE参数,可以增加每次数据库访问的检索数量,建议值为200.
  5. 6、使用Decode函数来减少处理时间
  6. 7、整合简单、无关的数据库访问(尽量整合到一个查询中)
  7. 8、删除重复记录(使用rowid等)
  8. 9、使用Truncate代替Delete,不再处理回滚段信息,减少额外消耗。
  9. 10、尽量多使用commit,释放更多资源
  10. 11、用where子句替换Having子句
  11. 12、减少对表的查询(特别是含有子查询的SQL中)
  12. 13、通过内部函数提高SQL效率
  13. 14、使用表的别名(Alias),在每个Column前缀增加别名,能够减少解析识别和Column歧义
  14. 15、用Exists替代IN,用NOT Exists替代NOT IN(可以用外连接Outer Joins替换)
  15. 16、识别‘低效’执行的SQL语句(大SQL)
  16. 17、用索引提高效率
  17. 18、用Exists替换Distinct
  18. 19、SQL语句用大写的,因为Oracle总是先解析sql语句,把小写的字母转换成大写的再执行。
  19. 20、在拼接的SQL串中尽量少用连接符,例如“+”
  20. 21、避免在索引列上使用NOT
  21. 22、避免在索引上使用计算,因为会导致优化器不再使用索引而导致全表扫描,例如SAL*12>25000调整为SAL>25000/12
  22. 23、用>=替代>
  23. 24、用Union替代OR(适用于索引列),会导致全表扫描,如果非要用OR,那就需要返回记录最少的索引列写在最前面
  24. 25、用IN替代OR
  25. 26、避免在索引列上使用IS NULL和IS NOT NNULL,会导致无法使用该索引。
  26. 27、总是使用索引的第一个列(针对联合索引)
  27. 28、用UNION ALL替换UNION(如果可能的话,UNION还有去除重复数据的逻辑)
  28.   UNION和UNION ALL的区别:
  29.   1)对重复结果的处理:UNION在进行表链接后会筛选掉重复的记录,Union All不会去除重复记录。
  30.   2)对排序的处理:Union将会按照字段的顺序进行排序;UNION ALL只是简单的将两个结果合并后就返回。
  31.   3)从效率上说,UNION ALL 要比UNION快很多,所以,如果可以确认合并的两个结果集中不包含重复数据且不需要排序时的话,那么就使用UNION ALL。
  32. 29、用Where替代Order BY
  33. 30、避免改变索引列的类型,例如Empno='123',写成empno=to_number('123')
  34. 31、需要当心的where子句
  35.   1)'!='不等于,不使用索引
  36.   2)'+'加,不使用索引
  37.   3)'||'连接函数,不使用索引
  38.   4)相同的索引列不能互相比较,将会启用全表扫描
  39. 32、如果检索数据量超过30%的表中记录数,使用索引将没有明显效果。
  40. 33、避免使用耗费资源的操作,例如Distinct、UNION、Minus、InterSect、Order By等SQL语句会启动SQL引擎。
  41. 34、优化Group by,可以通过将不需要的记录在Group by之前过滤掉。
  42. 35、select count(*)和select count(1)区别
  43.   1)没有主键用count(1)
  44.   2)有主键用count(主键)
  45.   3)如果表只有一个字段,用count(*) 最快
  46.   4)count(1)/count(*)都包括对NULL的统计,count(列)不包括NULL的统计。
  47.   5)select 1比select * 好,此时用sum(1)
  48. 36、Is Null与IS NOT NULL  都不允许使用索引
  49. 37、合理使用通配符,例如 like "%",第一个字符尽量不用通配符,否则不能走索引。
  50. 38、Order by语句,任何在order by语句的非索引项或者有计算表达式都将降低查询速度。
  51. 39、Not两种写法:
  52.   where not (ststus='VALID')
  53.   where ststus<>'VALID'
复制代码


回复

使用道具 举报

231

主题

2541

帖子

5807

积分

论坛元老

Rank: 8Rank: 8

积分
5807
 楼主| 发表于 2018-3-25 17:14:07 | 显示全部楼层
回复 支持 反对

使用道具 举报

231

主题

2541

帖子

5807

积分

论坛元老

Rank: 8Rank: 8

积分
5807
 楼主| 发表于 2018-3-25 17:14:34 | 显示全部楼层
回复 支持 反对

使用道具 举报

231

主题

2541

帖子

5807

积分

论坛元老

Rank: 8Rank: 8

积分
5807
 楼主| 发表于 2018-3-26 18:00:14 | 显示全部楼层
回复 支持 反对

使用道具 举报

231

主题

2541

帖子

5807

积分

论坛元老

Rank: 8Rank: 8

积分
5807
 楼主| 发表于 2018-3-26 18:00:41 | 显示全部楼层
回复 支持 反对

使用道具 举报

231

主题

2541

帖子

5807

积分

论坛元老

Rank: 8Rank: 8

积分
5807
 楼主| 发表于 2018-3-26 18:01:06 | 显示全部楼层
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|重庆度量科技  本站关键词:快速开发平台

GMT+8, 2018-9-18 22:08 , Processed in 0.350067 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表