来源:https://www.cnblogs.com/yangkunlisi/archive/2011/09/14/2176773.html
1、 语句中出现的所有表名、字段名全部小写,系统保留字、内置函数名、SQL保留字大写(SQL不区分大小写)。
2、 连接符or、in、and、以及=、!=、<、>、<=、>=、<>等前后加上一个空格。
3、 对较为复杂的SQL语句加上注释,说明算法、功能。(6) 可采用单行/多行注释。(-- 或 /* */ 方式)
4、 SQL语句的缩进风格(2) where子句书写时,每个条件占一行,语句令起一行时,以保留字或者连接符开始,连接符右对齐。
5、 多表连接时,使用表的别名来引用列。
6、 供别的文件或函数调用的函数,绝不应使用全局变量交换数据;
7、 变量令名不能超出ORACLE的限制(30个字符),令名要规范,要用英文令名,从变量上能看到变量的作用,如p名称 参数
8、 查找数据库表或视图时,只能取出确实需要的那些字段,不要使用*来代替所有列名。要清楚明白地使用列名,而不能使用列的序号。
9、 功能相似的过程和函数,尽量写到同一个包中,加强管理。1、避免嵌套连接。例如:A = B and B = C and C = D
2、where条件中尽量减少使用常量比较,改用主机变量
3、系统可能选择基于规则的优化器,所以将结果集返回数据量小的表作为驱动表(from后边最后一个表)。
4、大量的排序操作影响系统性能,所以尽量减少order by和group by排序操作。(2) 如结果集不需唯一,使用union all代替union。
5、索引的使用。(6) 查询列和排序列与索引列次序保持一致
6、尽量避免相同语句由于书写格式的不同,而导致多次语法分析,尽量使用Bind变量。
7、尽量使用共享的SQL语句。
8、查询的Where过滤原则,应使过滤记录数最多的条件放在最前面。
9、任何对列的操作都将导致表扫描,它包括数据库函数、计算表达式等等,查询时要尽可能将操作移至等号右边。
10、in、or子句常会使用工作表,使索引失效;如果不产生大量重复值,可以考虑把子句拆开;拆开的子句中应该包含索引。1、尽量少用嵌套查询。如必须,请用not exist代替not in子句。如例(2)
2、用多表连接代替EXISTS子句。如例(3)
3、少用DISTINCT,用EXISTS代替 如例(4)
4、使用UNION ALL、MINUS、INTERSECT提高性能
5、使用ROWID提高检索速度。对SELECT得到的单行记录,需进行DELETE、UPDATE操作时,使用ROWID将会使效率大大提高。
6、使用优化线索机制进行访问路径控制。
7、使用cursor时,显示光标优于隐式光标Select aka042 -- 单位缴费划入个人帐户比例
INTO prm_aaa043
FROM ka01 --医疗保险单位缴费划入个人帐户比例分段信息
Where akc021 = rec_kc01.akc021 -- 医疗人员类别
AND aka041 >= rec_kc01.akc023 -- 年龄上限
AND aka040 = prm_date or aae031 IS NULL ); -- 终止时间
X Select ......
FROM emp
Where dept_no NOT IN ( Select dept_no
FROM dept
Where dept_cat='A');
O Select ......
FROM emp e
Where NOT EXISTS ( Select 'X'
FROM dept
Where dept_no=e.dept_no
AND dept_cat='A');
X Select ......
FROM emp
Where EXISTS ( Select 'X'
FROM dept
Where dept_no=e.dept_no
AND dept_cat='A');
O Select ......
FROM emp e,dept d
Where e.dept_no=d.dept_no
AND dept_cat='A';
X Select DISTINCT d.dept_code,d.dept_name
FROM dept d ,emp e
Where e.dept_code=d.dept_code;
O Select dept_code,dept_name
FROM dept d
Where EXISTS ( Select 'X'
FROM emp e
Where e.dept_code=d.dept_code);