东方口岸科技有限公司SQL编写与优化规范

需积分: 10 6 下载量 86 浏览量 更新于2024-07-30 收藏 211KB DOC 举报
"此文档是关于SQL编写规范的详细指南,旨在提升SQL脚本的编写效率和性能,降低系统资源消耗,增强代码可读性和可维护性。这份规范由东方口岸科技有限公司的多个部门共同起草,适用于公司所有开发人员。文档包含了SQL的DQL和DML语言的书写规则,以及性能优化策略,特别强调了避免使用数据库特定语法,保持SQL语句的一致性和简洁性。此外,规范引用了多种编程语言的编码规范,以促进跨语言的统一标准。" SQL编写规范不仅涵盖了SQL的书写格式,还涉及到了性能优化的重要原则。其中,"驱动表"是指在多表联接查询中,从右到左处理的首个表,这影响了查询的执行顺序。"交叉表"则是指在联接查询中与其他所有表都关联的表,对于理解查询逻辑至关重要。 规范强调SQL语句应遵循ISO SQL标准,避免依赖特定数据库产品的语法,以确保代码的移植性。同一项目内的SQL书写应当统一,减少理解难度。复杂的SQL应尽量避免,因为它们可能导致执行效率低下,难以理解和维护。 在实际编写时,SQL语句应明确列名,不应使用列的序号或通配符"*",这样可以提高可读性并减少错误的可能性。插入语句需指定字段名,以确保数据插入的准确性。当涉及到多表连接时,正确的表连接顺序和使用合适的连接类型(如INNER JOIN, LEFT JOIN等)对优化查询性能至关重要。 此外,SQL语句中的变量和参数应与数据库中对应列的数据类型和大小匹配,防止因类型不兼容引发的问题。规范还提示,代码审查应依据此类规范进行,以便降低审查难度,提高代码质量。 这份规范为SQL编写提供了全面的指导,不仅关注代码的规范性,也注重性能的优化,是开发人员编写高效、易读、易维护SQL代码的重要参考。
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.减少访问数据库的次数