好好学习,天天向上

一些SQL优化技巧

索引

合理有效的使用索引可以提高查询效率 ## 选择合适的索引列规则 1. 选择在where子句中常用的查询列 2. 选择常用来关联表的字段 3. 对普通的B-TREE索引,应选择具有选择性高的字段做索引字段。若字段的不同取值很少,则选择性低,适合建位映射索引(效率更高,占用空间更小)。 4. 不要在经常被修改的字段上建索引。索引会降低update, insert, delete等操作的效率

避免在索引列上使用计算或在非基于函数的索引列上使用函数

  1. where子句中,若索引列是函数的一部分,优化器将不使用索引而使用全表扫描
  2. 使用了!=, |, 类型转换将不使用索引
  3. 要对使用函数的列启用索引,建议建基于函数的索引;也可以将计算右移

总使用索引的第一个列

  1. 若索引是复合索引,只有在它的第一个列被where子句引用时,优化器才会选择使用该索引。

顺序选择

表名顺序

  1. ORACLE解释器按 **从右到左 的顺序处理FROM子句中的表名。
  2. 在FROM子句包含多个表的情况下,应选择记录数最小的表作为基础表。
  3. 若有3个以上的表,则需选择交叉表作为基础表

where子句中的连接顺序

  1. ORACLE **自下而上 的解析where子句。表之间的连接应该写在其他where条件之前,那些可以过滤掉最大数量记录的条件应写在where子句的末尾。

更优的方法

使用union all,而不是union

union = union all + 排序剔重 若不需要踢重,使用union all会节省时间,提高效率

使用truncate,而不是delete

delete后,数据可以恢复。 而truncate后,数据不可恢复,因此很少资源被调用,执行时间也短。

使用where子句,而不是having子句

having语句是检索出结果后对结果集过滤。一般用于对一些聚合函数的比较

使用union,而不是or

  1. 对索引列用or会造成全表扫描
  2. 也可以用in替换or,更进一步,用exist替换in

其他

  1. 优化group by语句:将不需要的记录在group by之前过滤掉
  2. 慎用is null:null值不在索引中,若用is null操作会使用不了索引
  3. 在OLTP总是用绑定变量。例如:select * from tbl where msisdn=:1
  4. select语句中避免出现*
请言小午吃个甜筒~~