共兴达技术有限公司

新闻动态

News Information

养成良好的SQL规范--来提升SQL性能

在软件开发行业中,大家都了解代码编程规范的重要性,而对于SQL的规范却知道的甚少。其实养成良好的SQL规范不仅使SQL易读,更重要的是可以SQL的性能。下面为大家分享下个人所学。

(1).外联接推荐使用LEFT JOIN,不推荐(+)
  SELECT * FROM A,B WHERE A.ID=B.ID(+); (不推荐)
  SELECT * FROM A LEFT JOIN B ON A.ID=B.ID;(推荐)
  ※LEFT JOIN可读性高、功能更全面、通用性强、而且是新标准(性能上基本没有区别)

(2).件数查询推荐使用COUNT(1),不推荐COUNT(*)
  SELECT COUNT(*) FROM A (不推荐)
  SELECT COUNT(1) FROM A(推荐)
  ※COUNT(1)性能上极大提高

(3).用EXISTS替代IN、用NOT EXISTS替代NOT IN
  SELECT * FROM EMP WHERE DEPTNO IN (SELECT DEPTNO FROM DEPT)(不推荐)
  SELECT * FROM EMP WHERE EXISTS (SELECT 1 FROM DEPT WHERE DEPT.DEPTNO = EMP.DEPTNO)(推荐)
  ※通过使用EXISTS,会首先检查主查询,然后运行子查询直到它找到第一个匹配项,这就节省了时间。在执行IN子查询时,首先执行子查询,并将获得的结果列表存放在一个加了索引的临时表中。在执行子查询之前,系统先将主查询挂起,待子查询执行完毕,存放在临时表中以后再执行主查询。这也就是使用EXISTS比使用IN通常查询速度快的原因。

(4).用>= 替代>
  SELECT * FROM EMP WHERE DEPTNO >3 (不推荐)
  SELECT * FROM EMP WHERE DEPTNO >=4(推荐)

(5).用<>替代 !=
  SELECT * FROM EMP WHERE DEPTNO != 3 (不推荐)
  SELECT * FROM EMP WHERE DEPTNO<>4(推荐)

(6).避免不要破坏索引
  ①、避免索引上计算
  SELECT … FROM DEPT WHERE SAL * 12 > 25000; (不推荐)
  SELECT … FROM DEPT WHERE SAL > 25000/12;(推荐)

② 、避免索引上使用函数
  SELECT … FROM DEPT WHERE TRIM(CNO) = ‘S001’; (不推荐)
  SELECT … FROM DEPT WHERE CNO = ‘S001 ’;(推荐)
  ※对索引项目操作会破坏索引,严重导致性能低下。 

(7).避免类型强转.
  SELECT … FROM EMP WHERE SAL >= 1000 (不推荐)
  SELECT … FROM EMP WHERE SAL >= 1000(推荐)
  ※SAL为数值类型,内部发生的类型转换, 这个索引将不会被用到

(8).使用多表的时候,利用表的别名进行区分。
  SELECT ENAME, DNAME FROM EMP , DEPT WHERE EMP.DEPTNO = DEPT.DEPTNO; (不推荐)
  SELECT E.ENAME, D.DNAME FROM EMP E, DEPT D WHERE E.DEPTNO = D.DEPTNO;(推荐)

(9). 表关联条件按照表的先后顺序.
  SELECT *
  FROM A
  LEFT OUTER JOIN B
  ON B.XXX = A.XXX
  WHERE B.XXX = A.XXX (不推荐)

SELECT *
  FROM A
  LEFT OUTER JOIN B
  ON A.XXX = B.XXX
  WHERE A.XXX = B.XXX(推荐)

(10).WHERE条件的顺序按照:主键>索引>筛选量大的字段>普通字段的优先原则.

以上是个人针对SQL规范的小整理,有整理不足的地方希望大家补充。

在做项目的时候希望大家能够按照上面养成良好的SQL编写习惯,从而提升SQL的性能。

PS:关于SQL性能方面,还有很多很多补充点和注意点,待日再继续向大家介绍!!!