数据库SQL语句书写注意事项

1. 从多个表中选择记录(表名顺序)

执行顺序为从右往左,即表记录数少的放到右边,即最为基础表。如果有三个以上的表做连接查询,我们将交叉表作为基础表(即被其他表应用的表,即关系表)

2. WHERE子句中的连接顺序

ORACLE按照自左向右的顺序执行,即那些可以过滤掉最大数量记录的条件必须写在WHERE子句的最右边,即末尾。
对于SQL Server有两种说法,第一种:不用考虑顺序,SQLServer会自动执行过滤数据较多的条件;第二种:从左向右的执行顺序。

3.SELECT子句中一定避免使用 ‘ * ‘

注意一定别是用* ,巨耗时。

4. 删除重复记录

避免表中出现重复记录。
Oracle中最高效的删除重复记录方法的例子:

DELETE FROM EMP E WHERE E.ROWID > (SELECT MIN(X.ROWID) FROM EMP X WHERE X.EMP_NO = E.EMP_NO);

5 尽量多使用COMMIT

只要有可能,在程序中尽量多使用COMMIT, 以便及时释放资源,提高性能。 COMMIT所释放的资源:
第一, 回滚段上用于恢复数据的信息.
第二, 被程序语句获得的锁。
第三, redo log buffer 中的空间
第四, ORACLE为治理上述3种资源中的内部花费

6 用Where子句替换HAVING子句

避免使用HAVING子句, HAVING要检索所有记录后,才进行过滤,这个处理需要排序,总计等操作. 假如能通过WHERE子句限制记录的数目,那就能减少这方面的开销.

7 使用表的别名(Alias)

当在SQL语句中连接多个表时,使用表的别名并把别名前缀于每个Column上.这样一来,就可以减少解析的时间并减少那些由Column歧义引起的语法错误.

8 用EXISTS替代IN、用NOT EXISTS替代NOT IN

使用EXISTS(或NOT EXISTS)通常将提高查询的效率.无论在哪种情况下,NOT IN都是最低效的 (因为它对子查询中的表执行了一个全表遍历).

例子:

(高效)SELECT * FROM EMP (基础表) WHERE EMPNO > 0 AND EXISTS (SELECT ‘X' FROM DEPT WHERE DEPT.DEPTNO = EMP.DEPTNO AND LOC = ‘MELB') 
(低效)SELECT * FROM EMP (基础表) WHERE EMPNO > 0 AND DEPTNO IN(SELECT DEPTNO FROM DEPT WHERE LOC = ‘MELB') 

9 用索引提高效率

因为索引需要额外的存储空间和处理,那些不必要的索引反而会使查询反应时间变慢.。定期的重构索引是有必要的:

ALTER INDEX <INDEXNAME> REBUILD <TABLESPACENAME> 

10 用EXISTS替换DISTINCT

当提交一个包含一对多表信息(比如部门表和雇员表)的查询时,避免在SELECT子句中使用DISTINCT. 一般可以考虑用EXIST替换, EXISTS 使查询更为迅速,因为RDBMS核心模块将在子查询的条件一旦满足后,马上返回结果. 例子:

(低效): SELECT DISTINCT DEPT_NO,DEPT_NAME FROM DEPT D , EMP E WHERE D.DEPT_NO = E.DEPT_NO
(高效): SELECT DEPT_NO,DEPT_NAME FROM DEPT D WHERE EXISTS ( SELECT ‘X' FROM EMP E WHERE E.DEPT_NO = D.DEPT_NO); 

11 sql语句用大写的

因为oracle总是先解析sql语句,把小写的字母转换成大写的再执行

12 避免在索引列上使用NOT 通常

我们要避免在索引列上使用NOT, NOT会产生在和在索引列上使用函数相同的影响. 当ORACLE”碰到”NOT,他就会停止使用索引转而执行全表扫描.

13 避免在索引列上使用计算

假如索引列是函数的一部分.优化器将不使用索引而使用全表扫描.举例:

低效:SELECTFROM DEPT WHERE SAL * 12 > 25000;
高效: SELECTFROM DEPT WHERE SAL > 25000/12;

14 用>=替代>

高效:SELECT * FROM EMP WHERE DEPTNO >=4
低效:SELECT * FROM EMP WHERE DEPTNO >3

两者的区别在于, 前者DBMS将直接跳到第一个DEPT等于4的记录而后者将首先定位到DEPTNO=3的记录并且向前扫描到第一个DEPT大于3的记录.

15 避免在索引列上使用IS NULL和IS NOT NULL

在索引中判空,将无法使用该索引.

低效: (索引失效) SELECTFROM DEPARTMENT WHERE DEPT_CODE IS NOT NULL; 
高效: (索引有效) SELECTFROM DEPARTMENT WHERE DEPT_CODE >=0; 

16 需要当心的WHERE子句

第一,!= 将导致索引无效
第二, '是字符连接函数. 将导致索引无效.
第三,+是数学函数 . 将导致索引无效.

发布了100 篇原创文章 · 获赞 33 · 访问量 5843

猜你喜欢

转载自blog.csdn.net/JAVA_I_want/article/details/103362116