SQL的一些条有技巧总结



1、使用列应用代替*

 

2、使用表连接而不是多个查询

 

3FROM子句中表的顺序,尽量把小表或索引的表放在表的后面。

   如果从查询结果来说,哪个表放在前面都一样,但是如果从查询效率来考虑,表之间的顺序是不能随意的。一般来说,Oracle的解析器在处理FROM子句中的表时,是按照从右到左的顺序,FROM子句中最后指定的表将被Oracle首先处理,Oracle将它作为驱动表(Driving Table),并对该表的数据进行排序;之后再扫描倒数第二个表;最后将所有从第二个表中检索出来的记录与第一个表中的合适记录进行合并。因此,建议在使用表的连接查询时,选择记录行数最少的表作为驱动表,也就是将它作为FROM子句中的最后一个表。

 

4WHERE子句的连接顺序

   Oracle采用自右至左(自下向上)的顺序解析WHERE子句,根据这个顺序,表之间的连接(就是主外键的连接)应该写在其他where条件之前表之间的连接应该写在其他where条件之前将可以过滤掉最大数量记录的条件写在where子句的末尾。

 

5、使用exists

1使用EXISTS替代INEXISTSIN不同,EXISTS只检查行的存在性,而IN检查实际的值。在子查询中,EXISTS提供的性能通常比IN提供的性能要好。

2)使用EXISTS替代DISTINCT。在连接查询的SELECT语句中,使用DISTINCT关键字用于禁止重复行。

 

6、索引列上所使用的操作符

  对索引列的操作语句应该尽量避免“非”操作符的使用,例如NOT!=<>!<!>NOT EXISTSNOTINNOT LIKE等,“非”操作符的使用会造成Oracle对表执行全表扫描。另外,使用LIKE操作符可以应用通配符查询,但是如果用得不好,会产生性能上的问题。如LIKE %5400%’不会被使用到索引,而LIKE 5400%’则会引用范围索引。因为第一个字符为通配符时,索引不再起作用,Oracle执行全表扫描。

 

7、避免对惟一索引列使用NULL

   使用UNIQUE关键字可以为列添加惟一索引,也就是说列的值不允许有重复值,但是,多个NULL值却可以同时存在,因为Oracle认为两个空值是不相等的。向包含惟一索引的表中添加数据时,可以添加无数条NULL值的记录,但是由于这些记录都是空值,所以在索引中并不存在这些记录。因此,在WHERE子句中使用IS NULLISNOT NULL,对惟一索引列进行空值比较时,Oracle将停止使用该列上的惟一索引,导致Oracle进行全表扫描。

 

猜你喜欢

转载自blog.csdn.net/CongBird/article/details/79731330