新闻动态
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性能方面,还有很多很多补充点和注意点,待日再继续向大家介绍!!!