• SQL书写规范


    一、SQL书写规范

    1、 语句中出现的所有表名、字段名全部小写,系统保留字、内置函数名、Sql保留字大写。
    2、 连接符or、in、and、以及=、=等前后加上一个空格。
    3、 对较为复杂的sql语句加上注释,说明算法、功能。
    注释风格:注释单独成行、放在语句前面。
    (1) 应对不易理解的分支条件表达式加注释;
    (2) 对重要的计算应说明其功能;
    (3) 过长的函数实现,应将其语句按实现的功能分段加以概括性说明;
    (4) 每条SQL语句均应有注释说明(表名、字段名)。
    (5) 常量及变量注释时,应注释被保存值的含义(必须),合法取值的范围(可选)
    (6) 可采用单行/多行注释。(-- 或 /* */ 方式)
    4、 SQL语句的缩进风格
    (1) 一行有多列,超过80个字符时,基于列对齐原则,采用下行缩进
    (2) where子句书写时,每个条件占一行,语句令起一行时,以保留字或者连接符开始,连接符右对齐。
    5、 多表连接时,使用表的别名来引用列。
    6、 供别的文件或函数调用的函数,绝不应使用全局变量交换数据;
    7、 变量令名不能超出ORACLE的限制(30个字符),令名要规范,要用英文令名,从变量上能看到变量的作用,如
    g名称 全局变量
    m名称 局部变量
    c名称 光标
    p名称 参数
    8、 查找数据库表或视图时,只能取出确实需要的那些字段,不要使用*来代替所有列名。要清楚明白地使用列名,而不能使用列的序号。
    9、 功能相似的过程和函数,尽量写到同一个包中,加强管理。
    如例(1)

    二、 书写优化性能建议
    1、避免嵌套连接。例如:A = B and B = C and C = D
    2、where条件中尽量减少使用常量比较,改用主机变量
    3、系统可能选择基于规则的优化器,所以将结果集返回数据量小的表作为驱动表(from后边最后一个表)。
    4、大量的排序操作影响系统性能,所以尽量减少order by和group by排序操作。
    如必须使用排序操作,请遵循如下规则:
    (1) 排序尽量建立在有索引的列上。
    (2) 如结果集不需唯一,使用union all代替union。
    5、索引的使用。
    (1) 尽量避免对索引列进行计算。如对索引列计算较多,请提请系统管理员建立函数索引。
    (2) 尽量注意比较值与索引列数据类型的一致性。
    (3) 对于复合索引,SQL语句必须使用主索引列
    (4) 索引中,尽量避免使用NULL。
    (5) 对于索引的比较,尽量避免使用NOT=(!=)
    (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);

    注释范例
    过程注释:
    过程都以sp_开头,注意过程名称要符合令名要求
    /**************************************************************************
    name:sp_Write_log
    parameter:p_textContext in varchar2 参数描述
    create date:2003-04-1
    creater:chen jiping
    desc:过程总功能描述
    ****************************************************************************/
    函数注释
    函数以f开头,令名符合令名标准
    /**************************************************************************
    name:f_Get_JobId
    parameter:p_Name in varchar2 参数描述
    return number:返回值描述
    create date:2003-04-1
    creater:chen jiping
    desc:函数总功能描述
    ****************************************************************************/

  • 相关阅读:
    Android中实现定时器的三种方法 分类: Android 2015-07-14 18:04 11人阅读 评论(0) 收藏
    java构造器内部多态方法
    java继承方法覆盖
    java对象实例化 静态块,对象块,构造函数执行顺序
    Linux 的系统运行级别
    Jmeter启动jmeter-server.bat 报java.io.FileNotFoundException:rmi_keystore.jks 解决方法
    jmeter中JSON Extractors使用
    CentOS6.5下安装jenkins
    day12接口自动化测试框架
    day10 python接口开发、mock接口、网络编程
  • 原文地址:https://www.cnblogs.com/helife/p/1918523.html
Copyright © 2020-2023  润新知