SQL优化笔记[2019年12月]
1.表的连接数
待完成
2.exist 与 in 详解
- in () 适合B表比A表数据小的情况
- exists() 适合B表比A表数据大的情况
- 当A表数据与B表数据一样大时,in与exists效率差不多,可任选一个
3. “*”号
尽量避免使用*,Oracle数据库中,数据库会先把*号解析为表中所有的列名,在这个过程中,会去查数据字典,这个过程会耗费一定的时间。
4.索引
1.当在where条件中使用 is null 和 is not null 时,不走索引
2.当使用通配符时,通配符在首位的时候是不走索引的
3.在where条件中用连接字符串,也会不走索引
4.在where条件中对字段进行表达式操作,函数操作时,都会造成全表扫描
5. or 使用or的话如果or条件的每个列都加上索引,就会走索引,如果or多个列有的列没有索引那么不会走索引,这时可以考虑UNION ALL
索引的需要额外的空间存放索引数据,并且insert、update和delete都会对索引进行更新,会增加磁盘的IO,所以索引并不是越多越好,不必要的字段尽量不加索引。
注:索引的好处在于避免了全表扫描
5.decode
1.decode可以避免重复扫描相同的记录或重复连接相同的表
6.truncate 代替 delete 详解
但是就应用来说,一般情况下我们做的都是增量的抽取,并且有时候直接操 作生产库,为了保险,我们一般会跟据SQL先查出需要删除的数据,然后再把这条SQL语句改成delete语句,这样可以保证不会出错。而且delete可以回滚。
7.SQL语句大写
因为Oracle再解析时会先将小写字母转成大写字母,然后再去执行。
8. union与union all
union 会去重,所以再同样效果的情况下,使用union all
9. on where having
在SQL语句中,起作用的顺序先是on,然后是where,再然后是having ,可以根据具体的情况,去抒写3个关键字中的条件,数据量越少,SQL执行的速度就会越快。
10.使用表别名
当在SQL语句中连接多个表时, 在每一列上都加上表的别名,可以减少解析的时间,避免列重复引起的歧义。
11.临时表
待完成