Oracle SQL编码规范与最佳实践

3星 · 超过75%的资源 需积分: 10 28 下载量 192 浏览量 更新于2024-07-20 收藏 893KB PDF 举报
"资深DBA总结的Oracle SQL编写规范,旨在提升开发效率和代码质量,降低后期维护成本。包括SQL语句与PL/SQL的基本编码规范、优化类编码规范等多个方面,涵盖命名、注释、语法结构、性能优化等多个要点。" 在Oracle数据库的开发中,遵循一定的SQL编写规范至关重要,这有助于提升代码可读性,减少错误,提高系统性能,并便于团队协作。以下是对这些规范的详细说明: 1. **SQL语句基本编码规范** - **英文字母编写**:为了统一风格,建议所有的SQL语句关键字和表名使用大写字母,而保留小写字母用于区分变量和列名。 - **空格使用**:合理使用空格以增加代码可读性,如在运算符周围添加空格。 - **注释**:清晰、简洁的注释可以帮助理解代码功能,建议在每个过程或函数开头添加描述。 - **缩进**:保持代码缩进的一致性,通常使用4个空格进行缩进。 - **换行**:避免过长的单行SQL,适时换行以提高可读性。 - **禁止使用"*"**:在SELECT语句中,避免使用通配符"*",以明确指定所需列。 - **关联时表别名使用**:使用表别名简化复杂查询,提高可读性。 - **当前时间写入规范**:使用SYSDATE获取当前日期,避免函数使用,以利于优化。 - **过滤匹配慎用函数**:避免在WHERE子句中使用函数,可能导致无法利用索引。 - **避免使用等值查询**:在特定情况下,考虑使用索引反向键或范围查询来提高性能。 - **树形结构查询**:处理层级数据时,利用递归或自连接,避免过多的嵌套查询。 2. **PL/SQL基本编码规范** - **命名规范**:采用有意义的命名,遵循一致的命名规则。 - **过程及匿名块命名规范**:清晰表明过程或块的功能,使用驼峰命名法。 - **数据库代码接口管理**:保持接口的稳定性和一致性,避免频繁修改。 - **PL/SQL编写格式**:遵循标准格式,如BEGIN/END块的缩进。 - **PL/SQL注释编写要点**:详细注释逻辑复杂的部分,方便理解和维护。 - **PL/SQL块语句跟踪**:使用DBMS_OUTPUT.PUT_LINE等工具跟踪代码执行。 - **PL/SQL块游标推荐使用方式**:推荐使用显式游标,避免隐式游标带来的不确定性。 - **尽量使用ORACLE原生函数**:原生函数通常更高效且维护性好。 - **推荐使用DECODE**:DECODE函数可以简化条件判断,提高代码可读性。 - **禁止使用GOTO/RETURN语句**:避免程序流程变得复杂,使用异常处理或嵌套块。 - **外关联写法**:明确指定外关联条件,防止意外结果。 - **关于循环的推荐写法**:使用FOR循环或WHILE循环,避免无限循环。 - **发布的代码需屏蔽调试类语句**:发布前移除或注释掉调试代码。 - **避免使用视图作多表关联**:直接在SQL中使用JOIN,以优化性能。 3. **SQL语句及PL/SQL优化类编码规范** - **多表关联编写顺序**:根据关联的大小和索引安排关联顺序。 - **避免嵌套连接**:使用JOIN代替,提高执行效率。 - **禁止滥用排序及分组**:只在必要时使用ORDER BY和GROUP BY,减少计算量。 - **关于绑定变量**:使用绑定变量以减少解析次数,提高性能。 - **关于临时表使用**:谨慎使用临时表,考虑是否可以替代为内存操作。 - **避免NOT IN及相关子查询写法**:转换为EXISTS或JOIN以优化查询。 - **少用DISTINCT,用GROUP BY代替**:GROUP BY通常更高效,且更明确。 - **合理使用ROWID**:在特定场景下,ROWID可以加速访问,但不宜滥用。 - **以BETWEEN替代<= AND >=**:提高查询效率,尤其是在索引中使用。 - **合理使用编译开关(hint)**:通过提示优化器选择更适合的执行计划。 - **尽可能少用嵌套动态视图**:过多嵌套可能影响性能。 - **禁用ROWNUM=N(某整数)写法**:这种写法可能导致全表扫描,应改用其他方法。 - **游标关闭**:确保每次使用后关闭游标,释放资源。 - **减少LONG类型的使用**:使用LOB类型处理大字段,以支持更大的数据。 这些规范是资深DBA在实践中总结的经验,遵循这些规则,可以显著提高Oracle数据库应用程序的质量和性能。
2010-01-27 上传
8.用执行计划分析SQL性能      EXPLAIN PLAN是一个很好的分析SQL语句的工具,它可以在不执行SQL的情况下分析语句      通过分析,我们就可以知道ORACLE是怎样连接表,使用什么方式扫描表(索引扫描或全表扫描),以及使用到的索引名称      按照从里到外,从上到下的次序解读分析的结果      EXPLAIN PLAN的分析结果是用缩进的格式排列的,最内部的操作将最先被解读,如果两个操作处于同一层中,带有最小操作号的将首先被执行      目前许多第三方的工具如PLSQL Developer和TOAD等都提供了极其方便的EXPLAIN PLAN工具      PG需要将自己添加的查询SQL文记入log,然后在EXPLAIN PLAN中进行分析,尽量减少全表扫描      ORACLE SQL性能优化系列      1.选择最有效率的表名顺序(只在基于规则的优化器中有效)      ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,因此FROM子句中写在最后的表(基础表driving table)将被最先处理      在FROM子句中包含多个表的情况下,必须选择记录条数最少的表作为基础表      当ORACLE处理多个表时,会运用排序及合并的方式连接它们      首先,扫描第一个表(FROM子句中最后的那个表)并对记录进行排序;      然后扫描第二个表(FROM子句中最后第二个表);      最后将所有从第二个表中检索出的记录与第一个表中合适记录进行合并      例如:      表 TAB1 16,384 条记录      表 TAB2 5 条记录      选择TAB2作为基础表 (最好的方法)      select count(*) from tab1,tab2 执行时间0.96秒      选择TAB2作为基础表 (不佳的方法)      select count(*) from tab2,tab1 执行时间26.09秒      如果有3个以上的表连接查询,那就需要选择交叉表(intersection table)作为基础表,交叉表是指那个被其他表所引用的表      例如:   EMP表描述了LOCATION表和CATEGORY表的交集   SELECT *   FROM LOCATION L,   CATEGORY C,   EMP E   WHERE E.EMP_NO BETWEEN 1000 AND 2000   AND E.CAT_NO = C.CAT_NO   AND E.LOCN = L.LOCN      将比下列SQL更有效率   SELECT *   FROM EMP E ,   LOCATION L ,   CATEGORY C   WHERE E.CAT_NO = C.CAT_NO   AND E.LOCN = L.LOCN   AND E.EMP_NO BETWEEN 1000 AND 2000      2.WHERE子句中的连接顺序      ORACLE采用自下而上的顺序解析WHERE子句      根据这个原理,表之间的连接必须写在其他WHERE条件之前,那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾      例如:   (低效,执行时间156.3秒)   SELECT *   FROM EMP E   WHERE SAL > 50000   AND JOB = 'MANAGER'   AND 25 < (SELECT COUNT(*) FROM EMP WHERE MGR=E.EMPNO);      (高效,执行时间10.6秒)   SELECT *   FROM EMP E   WHERE 25 50000   AND JOB = 'MANAGER';      3.SELECT子句中避免使用'*'      当你想在SELECT子句中列出所有的COLUMN时,使用动态SQL列引用'*'是一个方便的方法,不幸的是,这是一个非常低效的方法      实际上,ORACLE在解析的过程中,会将'*'依次转换成所有的列名      这个工作是通过查询数据字典完成的,这意味着将耗费更多的时间      4.减少访问数据库的次数