




已阅读5页,还剩11页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
SQL 编码规范建议 Oracle 文档标识文档标识 当前版本当前版本 作作 者者 部门部门 厂商厂商 文文 档档 状状 态态 初稿 评审通过 修改 发布 作废 完成日期完成日期 SQL 编码规范建议 Oracle SSC 2 文档版本历史表文档版本历史表 版本号版本号作者作者操作操作日期日期说明说明 V 0 1陈强创建2012 11 16 文档审核记录表文档审核记录表 版本号版本号审核人审核人审核人签字审核人签字审核日期审核日期说明说明 SQL 编码规范建议 Oracle SSC 3 SQL 编码规范建议 Oracle SSC 4 目目目目 录录录录 引言引言 5 1 1 简介 5 1 2 目的 5 1 3 参考文献 5 2 SQL 编码规范编码规范 5 2 1 查询 SQL 语句 5 2 2 DML 操作 7 2 3 通用规范 8 2 4 共享 SQL 语句 8 3 性能优化性能优化 9 3 1 执行计划分析 SQL 性能 9 3 2 优化器 10 3 3 语句顺序 RBO 中有效 10 3 4 减少数据库或表访问次数 11 3 5 函数使用 13 3 6 索引 14 3 7 其他 15 SQL 编码规范建议 Oracle SSC 5 引言引言 1 1 简介简介 所有的程序开发手册都包含了各种规则 一些习惯自由程序的人 例如 Java 程序员 可能对这些规则很不适应 但是在多个开发人员共同协作的情况下 这些规则是必需的 这不仅仅是为了开发效率 而且也为了测试和后期维护 良好的编码习惯有助于标准化程序的结构和编码风格 使源代码对于自己和别人都易 读和易懂 在开发周期中越早使用恰当的编码规定 将会最大程度的提高项目的生产率 良好的编码习惯除了代码格式 详细的注释外 还应该包括使用有助于提高程序效率的编 码方式 规范的开发有助于提高源码的可读性 可维护性 对于提高项目的整体效率更是不可 缺少的 尤其是团队开发 1 2 目的目的 本文是针对程序员对 SQL 语句编写过程所应遵循的规范 按照此规范来开发 SQL 语 句可带来以下好处 SQL 语句编写保持一致性 提高代码的可读性和可维护性 提高 SQL 语句执行的效率 易于代码的回顾 1 3 参考文献参考文献 ORACLE SQL 性能优化系列 2 SQL 编码规范编码规范 2 1 查询查询 SQL 语句语句 1 不等于统一使用 Oracle 认为 和 是等价的 都代表不等于的意义 为了统一 不等于一律 使用 表示 2 使用表的别名 Alias 多表连接时 应为每个表使用别名 别名要简短最好一个字母 且能代表一定意义 所有被引用列要加上表的别名 当在 SQL 语句中连接多个表时 请使用表的别名并把别名前缀于每个 Column 上 可 减少解析的时间同时减少那些由 Column 歧义引起的语法错误 3 使用 SELECT 语句时 必须指出列名 SQL 编码规范建议 Oracle SSC 6 不要使用列的序号或者用 替代所有列名 当在 SELECT 子句中列出所有的列 COLUMN 时 使用动态 SQL 列引用 是一个方 便的方法 但这是一个非常低效的方法 实际上 ORACLE 在解析的过程中 会将 依次 转换成所有的列名 这个工作是通过查询数据字典完成的 这意味着将耗费更多的时间 4 减少子查询的使用 子查询除了可读性差之外 还在一定程度上影响了 SQL 运行效率 请尽量减少子查 询的使用 采用其他效率更高 可读性更好的方式替代 5 适当添加索引以提高查询效率 适当添加索引可以大幅度的提高检索速度 同时不要在 WHERE 字句中对索引列执行 函数操作 同时避免隐式转换 6 用 EXISTS 替代 IN 在许多基于基础表的查询中 为了满足一个条件 往往需要对另一个表进行联接 在 这种情况下 使用 EXISTS 或 NOT EXISTS 通常提高查询的效率 7 用 NOT EXISTS 替代 NOT IN 在子查询中 NOT IN 子句将执行一个内部的排序和合并 无论在哪种情况下 NOT IN 都是最低效的 因为它对子查询中的表执行了一个全表遍历 然后进行过滤 为了避免 使用 NOT IN 可以把它改写成外连接 Outer Joins 或 NOT EXISTS 8 计算记录条数 对索引列的计数是最快的 例如 COUNT EMPNO 9 用表连接替换 EXISTS 通常来说 采用表连接的方式比 EXISTS 更有效率 例如 低效 SELECT ENAME FROM EMP E WHERE EXISTS SELECT X FROM DEPT WHERE DEPT NO E DEPT NO AND DEPT CAT A 高效 SELECT ENAME FROM DEPT D EMP E WHERE E DEPT NO D DEPT NO AND DEPT CAT A 10 用 EXISTS 替换 DISTINCT 当提交一个包含一对多表信息 比如部门表和雇员表 的查询时 避免在 SELECT 子句 中使用 DISTINCT 一般可以考虑用 EXIST 替换 SQL 编码规范建议 Oracle SSC 7 例如 低效 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 EXISTS 使查询更为迅速 因为 RDBMS 核心模块将在子查询的条件一旦满足后立刻 返回结果 11 用 Where 子句替换 HAVING 子句 避免使用 HAVING 子句 HAVING 只会在检索出所有记录之后才对结果集进行过滤 这个处理需要执行排序 总计等操作 如果能通过 WHERE 子句限制记录的数目 那就能 减少这方面的开销 例如 低效 SELECT REGION AVG LOG SIZE FROM LOCATION GROUP BY REGION HAVING REGION SYDNEY AND REGION PERTH 高效 SELECT REGION AVG LOG SIZE FROM LOCATION WHERE REGION SYDNEY AND REGION PERTH GROUP BY REGION 2 2 DML 操作操作 DML 操作主要包括数据新增 修改和删除 1 使用 INSERT 语句时 必须指定插入的字段名 2 删除重复记录最高效的方法为使用 ROWID 如下 DELETE FROM EMP E WHERE E ROWID SELECT MIN X ROWID FROM EMP X WHERE X EMP NO E EMP NO SQL 编码规范建议 Oracle SSC 8 3 尽量多使用 COMMIT 在程序中尽量多使用 COMMIT 这样程序的性能得到提高 需求也会因为 COMMIT 所释放的资源而减少 COMMIT 所释放的资源 回滚段上用于恢复数据的信息 被程序语句获得的锁 redo log buffer 中的空间 ORACLE 为管理上述 3 种资源中的内部花费 4 用 TRUNCATE 替代 DELETE 来删除全表记录 当删除表中的所有记录时 在通常情况下 回滚段 rollback segments 用来存放可以被 恢复的信息 如果你没有 COMMIT 事务 ORACLE 会将数据恢复到删除之前的状态 准确 地说是恢复到执行删除命令之前的状况 而当运用 TRUNCATE 时 回滚段不再存放任何可被恢复的信息 当命令运行后 数 据不能被恢复 因此很少的资源被调用 执行时间也会很短 但由于不记录日志请酌情使 用 2 3 通用规范通用规范 1 不要使用数据库的类型自动转换功能 使用显式的类型转换 2 应使用变量绑定实现 SQL 语句共享 避免使用硬编码 2 4 共享共享 SQL 语句语句 为了不重复解析相同的 SQL 语句 在第一次解析之后 ORACLE 将 SQL 语句存放在 内存中 这块位于系统全局区域 SGA system global area 的共享池 shared buffer pool 中的内 存可以被所有的数据库用户共享 因此 当执行一个 SQL 语句 有时被称为一个游标 时 如果它和之前的执行过的语句完全相同 ORACLE 就能很快获得已经被解析的语句以及最 好的执行路径 ORACLE 的这个功能大大地提高了 SQL 的执行性能并节省了内存的使用 当提交一 个 SQL 语句 ORACLE 会首先在这块内存中查找相同的语句 注意 ORACLE 对两者采取的是一种严格匹配 要达成共享 SQL 语句必须完全相同 包括空格 换行 大小写等 共享的语句必须满足三个条件 a 字符级的比较 当前被执行的语句和共享池中的语句必须完全相同 例如 SELECT FROM EMP SELECT from EMP Select From Emp SQL 编码规范建议 Oracle SSC 9 SELECT FROM EMP 上例中的每条 SQL 都不能达成共享 b 两个语句所指的对象必须完全相同 例如 用户 对象名 如何访问 Jack sal limit private synonym JackWork city public synonym JackPlant detail public synonym Jill sal limit private synonym Jill Work city public synonym JillPlant detail table owner 考虑以下下列 SQL 语句能否在这两个用户 Jack Jill 之间共享 SQL SELECT MAX sal cap FROM sal limit 能否共享 不能 原因 每个用户都有一个 private synonym sal limit 它们是不同的对象 SQL SELECT COUNT 0 FROM work city WHERE sdesc LIKE NEW 能否共享 能 原因 两个用户访问相同的对象 public synonym work city SQL SELECT a sdesc b location FROM work city a plant detail b WHERE a city id b city id 能否共享 不能 原因 用户 jack 通过 public synonym 访问 plant detail 而 jill 是表的所有者 对象不同 c 应使用变量绑定实现 SQL 语句共享 避免使用硬编码 执行相同操作的 SQL 语句必 须使用相同名字的绑定变量 例如 第一组的两个 SQL 语句 绑定变量是相同的 而第二组中的两个语句绑定变量 不同 即使赋于不同的绑定变量相同的值也不能使这两个 SQL 语句相同 达不到共享 SQL 语句目的 第一组 select pin name from people where pin blk1 pin select pin name from people where pin blk1 pin 能否共享 能 第二组 select pin name from people where pin blk1 ot ind select pin name from people where pin blk1 ov ind 能否共享 不能 3 性能优化性能优化 3 1 执行计划分析执行计划分析 SQL 性能性能 EXPLAIN PLAN 是一个很好的分析 SQL 语句的工具 它可以在不执行 SQL 的情况下 SQL 编码规范建议 Oracle SSC 10 分析语句 通过分析 就可以知道 ORACLE 是怎样连接表 使用什么方式扫描表 索引扫 描或全表扫描 以及使用到的索引名称 按照从里到外 从上到下的次序解读分析的结果 EXPLAIN PLAN 的分析结果是用缩进的格式排列的 最内部的操作将最先被解读 如 果两个操作处于同一层中 带有最小操作号的将首先被执行 NESTED LOOP 是少数不按照上述规则处理的操作 正确的执行路径是检查对 NESTED LOOP 提供数据的操作 其中操作号最小的将被最先处理 目前许多第三方的工具如 PLSQL Developer 和 TOAD 等都提供了极其方便的 EXPLAIN PLAN 工具 或者用下列 SQL 工具找出低效 SQL SELECT EXECUTIONS DISK READS BUFFER GETS ROUND BUFFER GETS DISK READS BUFFER GETS 2 Hit radio ROUND DISK READS EXECUTIONS 2 Reads per run SQL TEXT FROM V SQLAREA WHERE EXECUTIONS 0 AND BUFFER GETS 0 AND BUFFER GETS DISK READS BUFFER GETS 50000 AND JOB MANAGER AND 25 SELECT COUNT FROM EMP WHERE MGR E EMPNO 高效 SELECT FROM EMP E WHERE 25 50000 AND JOB MANAGER SQL 编码规范建议 Oracle SSC 12 3 4 减少数据库或表访问次数减少数据库或表访问次数 当执行每条 SQL 语句时 ORACLE 在内部执行了许多工作 解析 SQL 语句 估算索 引的利用率 绑定变量 读数据块等等 由此可见 减少访问数据库或表次数 就能实际 上减少 ORACLE 的工作量 1 整合简单 无关联的数据库访问 如果有几个简单的数据库查询语句 可以把它们整合到一个查询中 即使它们之间没有 关系 例如 SELECT NAME FROM EMP WHERE EMP NO 1234 SELECT NAME FROM DPT WHERE DPT NO 10 SELECT NAME FROM CAT WHERE CAT TYPE RD 上面的 3 个查询可以被合并成一个 SELECT E NAME D NAME C NAME FROM CAT C DPT D EMP E DUAL X WHERE NVL X X DUMMY NVL X E ROWID AND NVL X X DUMMY NVL X D ROWID AND NVL X X DUMMY NVL X C ROWID AND E EMP NO 1234 AND D DEPT NO 10 AND C CAT TYPE RD 2 减少对表的查询 在含有子查询的 SQL 语句中 要特别注意减少对表的查询 例如 低效 SELECT TAB NAME FROM TABLES WHERE TAB NAME SELECT TAB NAME FROM TAB COLUMNS WHERE VERSION 604 AND DB VER SELECT DB VER FROM TAB COLUMNS WHERE VERSION 604 高效 SQL 编码规范建议 Oracle SSC 13 SELECT TAB NAME FROM TABLES WHERE TAB NAME DB VER SELECT TAB NAME DB VER FROM TAB COLUMNS WHERE VERSION 604 3 Update 多个 Column 例子 低效 UPDATE EMP SET EMP CAT SELECT MAX CATEGORY FROM EMP CATEGORIES SAL RANGE SELECT MAX SAL RANGE FROM EMP CATEGORIES WHERE EMP DEPT 0020 高效 UPDATE EMP SET EMP CAT SAL RANGE SELECT MAX CATEGORY MAX SAL RANGE FROM EMP CATEGORIES WHERE EMP DEPT 0020 3 5 函数使用函数使用 1 使用 DECODE 函数来减少处理时间 使用 DECODE 函数可以避免重复扫描相同记录或重复连接相同的表 例如 SELECT COUNT SUM SAL FROM EMP WHERE DEPT NO 0020 AND ENAME LIKE SMITH SELECT COUNT SUM SAL FROM EMP WHERE DEPT NO 0030 AND ENAME LIKE SMITH 使用 DECODE 函数整合 SQL 语句 SELECT COUNT DECODE DEPT NO 0020 X NULL D0020 COUNT COUNT DECODE DEPT NO 0030 X NULL D0030 COUNT SUM DECODE DEPT NO 0020 SAL NULL D0020 SAL SUM DECODE DEPT NO 0030 SAL NULL D0030 SAL FROM EMP WHERE ENAME LIKE SMITH 相同原理 DECODE 函数也可以运用于 GROUP BY 和 ORDER BY 子句中 2 通过内部函数提高 SQL 效率 SQL 编码规范建议 Oracle SSC 14 SELECT H EMPNO E ENAME H HIST TYPE T TYPE DESC COUNT FROM HISTORY TYPE T EMP E EMP HISTORY H WHERE H EMPNO E EMPNO AND H HIST TYPE T HIST TYPE GROUP BY H EMPNO EENAME H HIST TYPE T TYPE DESC 通过调用下面的函数可以提高效率 FUNCTION LOOKUP HIST TYPE TYP IN NUMBER RETURN VARCHAR2 AS TDESC VARCHAR2 30 CURSOR C1 IS SELECT TYPE DESC FROM HISTORY TYPE WHERE HIST TYPE TYP BEGIN OPEN C1 FETCH C1 INTO TDESC CLOSE C1 RETURN NVL TDESC END FUNCTION LOOKUP EMP EMP IN NUMBER RETURN VARCHAR2 AS ENAME VARCHAR2 30 CURSOR C1 IS SELECT ENAME FROM EMP WHERE EMPNO EMP BEGIN OPEN C1 FETCH C1 INTO ENAME CLOSE C1 RETURN NVL ENAME END SELECT H EMPNO LOOKUP EMP H EMPNO H HIST TYPE LOOKUP HIST TYPE H HIST TYPE COUNT FROM EMP HISTORY H GROUP BY H EMPNO H HIST TYPE 3 6 索引索引 索引是表的一个概念部分 用来提高检索数据的效率 实际上 ORACLE 使用了一个 复杂的自平衡 B tree 结构 通常 通过索引查询数据比全表扫描要快 当 ORACLE 找出执 SQL 编码规范建议 Oracle SSC 15 行查询和 Update 语句的最佳路径时 ORACLE 优化器将使用索引 同样在联结多个表时 使用索引也可以提高效率 另一个使用索引的好处是 它提供了主键 primary key 的唯一性 验证 1 利用索引提高 SQL 语句执行效率 除了那些 LONG 或 LONG RAW 数据类型 可以索引几乎所有的列 通常 在大型表 中使用索引特别有效 当然 在扫描小表时 使用索引同样能提高效率 虽然使用索引能得到查询效率的提高 但是我们也必须注意到它的代价 索引需要空 间来存储 也需要定期维护 每当有记录在表中增减或索引列被修改时 索引本身也会被 修改 这
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年汽车轻量化材料在汽车轻量化车身制造工艺中的应用趋势报告
- 现场品质培训课件
- 2025年智能制造示范工厂建设中的环保与可持续发展实施方案报告
- 2025年数字艺术产业报告:作品创作、交易与版权保护市场风险与机遇分析
- 现场传授式专业知识培训课件
- 2026届浙江省杭州市西湖区杭州学军中学化学高二上期末统考模拟试题含答案
- 浙江省杭州市杭州第二中学2026届化学高一第一学期期中监测试题含解析
- 2026届贵州省遵义市务川民族中学化学高二上期末质量跟踪监视试题含答案
- 现代水文学研究生课件
- 2026届广西岑溪市高一化学第一学期期末联考模拟试题含解析
- (2025年标准)淘宝分红合同协议书
- 矿山工程合同范本
- 商用中小型冷库知识培训课件
- 2025年黑龙江省水利水电集团有限公司招聘考试笔试试题(含答案)
- 抗战胜利八十周年纪念-2025-2026学年高二上学期爱国主义教育主题班会
- 银行理财规划配置方案(3篇)
- 2025年安徽省综合评标评审专家库考试历年参考题库含答案详解(5卷)
- 2025-2030中国城市更新政策演变与实施路径专项调研报告
- 小红书运营:小红书账号运营培训课件
- 瑞吉欧活动-人群课件
- 大学生生命教育与心理危机应对
评论
0/150
提交评论