




已阅读5页,还剩18页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
皮皮网运维部 2012.10 一、概述 本规范侧重于代码编写过程中SQL 语句的编写规范问题,内容涉及编 写风格、编写规范、SQL语句编写 过程中的优化建议、不良SQL语句 的优化等方面。 二、SQL编写风格 2.1、SQL语句的大小写 u SQL语句的关键字统一使用全小写或全大写的方式,例如: select,update,from,where,order,by,group by declare,begin,end等。 u 标识符,变量和参数采用小写,如v_sal。 u 数据库对象、列以及别名用小写。 2.2、SQL语句缩进与换行 sql语句中的关键字右对齐。 select/from/where/order by/group by等子句应独占一行。 select子句内容如果只有一项,应与 select 同占一行。 select子句内容如果多于一项,每一项都应独占一行,并在对应 select的基础上向右缩进8个字符。 from子句内容如果只有一项,应与 from同占一行。 from子句内容如果多于一项,每一项都应独占一行,并在对应from 的基础上向右缩进4个字符。 where子句内容如果只有一项,应与 where同占一行。 where子句的条件如果有多项,每一个条件应独占一行,并以and开 头,并在对应where的基础上向右缩进4个字符。 update set子句内容每一项单独占一行,无缩进。 insert子句内容每个表字段单独占一行,无缩进;values每一项单 独占一行,无缩进 。 SQL语句缩进与换行示例: -select语句书写的正确示例 1、 select column_name from table_name where column_name =xxxxxxxxx; 2、 select a.column1, a.column2, b.column3 from table_name_1 a , table_name_2 b where a.column1 = b.column2 and b.stat= 2; -update语句书写的正确示例 update table_name set list_stat = xxx, parent = xxx, name=xxx where list_no = xxx and city=xxx; -Insert语句书写的正确示例 insert into table_name ( list_no, list_stat, parent, manifest_no, div_flag ) values ( bill020, 1, 0, 000000000000007807, 0 ); 2.3、SQL语句编写应遵循以下空格规则 1. SQL语句中不允许出现空行。 2. SQL语句内的算术运算符、逻辑运算符(AND、OR、NOT)、 比较 运算符(=、=、BETWEEN AND)、IN、LIKE等运 算符前后都应加一空格。 3. 逗号之后必须接一个空格。 4. 关键字、保留字和左括号之间必须有一个空格。 三、SQL语句编写规范 1、表结构设计的时候尽量选择合适的数据类型、合适的长度、避免行 链接、行迁移的出现,外键所在的字段一定要创建索引,否则,对 主表进行操作,外键所在的子表有可能被完全封锁。 2、SQL语句的语法应与所使用的数据库相适应。 3、关键SQL语句,尽量简化,不要包含太多的嵌套,避免执行计划错 误的可能,原则上不能超过2层。 4、SQL语句包含多表连接时,建议使用表别名,对每个字段的使用都 要带上表别名,例如: select a.col1, a.col2, b.col3 from table_name a, tableb b where a.col4=b.col5; 5、多表关联避免超过5个,可以通过临时表(表变量),简化复杂的关联。 6、使用SELECT语句时,禁止使用select * ,应当指出具体查询的字段名, 例如:select col1,col2,col3, from table_name;。 7、使用INSERT语句时,禁止使用 insert into table_name values(?,?,?), 不应不指定字段名直接插入VALUES,应指定插入的字段名,例如: insert into table_name (col1, col2,) values(?,?,) 8、避免在where使用1=1,1=2这种表达式作为部分条件,例如: select col1, col2 from table_name where 1=1 and col1 0。 9、字符型字段必须加单引号,避免where查询条件做隐型转换时后出现混乱 。 10、SQL 语句的注释: 应遵循各语言编码规范的代码注释要求。 对较为复 杂的 SQL语句应注释,并说明算法和功能。 对重要的计算应说明其功能。 四、SQL语句编写过程中的优化建议 应用逻辑复杂时,使用SQL实现困难,尽量使用程序去实现。 建议使用hint固定关键SQL语句执行计划,原则上批量作业要用hint 指定索引; 在进行多条记录的增加、修改、删除时,建议使用批量提交,降低 事务的提交频度。 SQL语句要绑定变量实现SQL语句的共享,禁止使用常量。 对于分区表的查询,原则上使用分区键做条件; 尽量避免多表关联查询、特别是表之间的嵌套连接。 尽量使用exists、not exists 替代 in、not in(大部份情况下exists 、not exists的性能都比in 、not in 好)。 使用union 的时候如果没有去除重复数据的要求,建议尽量用union all替代 。 尽量避免使用order by和group by排序操作,因为大量的排序操作影响系 统性能。如必须使用排序操作,尽量建立在有索引的列上。 索引的建立应慎重考虑,不是越多越好。索引可以提高相应的select的效 率,但同时也降低了INSERT、UPDATE 的效率。 Where 条件中的索引列应避免使用,not、 is null,is not null、 likke %xxxx%,%xxx,oracle系统函数。 开发人员对自己编写的SQL语句,要能够简单的评估自 己所写语句的执行计划,避免显而易见的问题:比如说 数据类型的隐式转换,大表上的全表扫描,对大表进行 多次扫描等等。 怎样生成执行计划,在SQL*PLUS里面可以通过set autotrace on 或set autotrace traceonly explain生成, 在PL/SQL Developer工具里面直接按键盘上面的F5。 五、不良sql语句优化 例1:不合理的执行计划,导致cpu使用率过高. select count(*) as rCount from ( select * from PPFILM_COFIG where SID not in (select MOV_ID from pp_code_movs where CODE_ID=3 ) order by idx desc) temp; RCOUNT - 646 Elapsed: 00:00:21.08 执行计划 问题说明: u ppfilm_config表中的记录为1192,pp_code_movs记录为76844 u 存在不必要的嵌套和排序操作(造成不合理执行计划的出现),书写不规 范。 u 语句在执行的时候逻辑读过高,占用大量的CPU资源(不合理的执行计划造 成)。 u 语句在解析的时候会将not in转换成Not exists 解决方法去除嵌套和排序、使用not exists 替代not in 优化后的语句如下: select count(*) from ppfilm_cofig pg where not exists ( select mov_id from pp_code_movs ps where ps.code_id=3 and pg.sid=ps.mov_id ); COUNT(*) - 646 Elapsed: 00:00:00.01 6、优化之后的执行计划和统计信息 例2:select * 导致不必要的输入输出 例2问题说明: pmt这张表有45个字段,实际查询需求只需要4个字段,使用”select *”导致大量的不必输 入输出。 select pmt.*, to_char(pmt.MOV_LASTMODIFY, yyyy-mm-dd hh24:mi:ss) MOV_LASTMODIFY, to_char(pmt.MOV_DATE, yyyymmddhh24miss) UPDATE_TIME, pmi.MOV_AVG_LEVEL, pmi.MOV_MARKCONUT, pmi.MOV_REVIEWCOUNT from pp_movies_info_tab pmi inner join pp_movies_tab pmt on pmi.MOV_ID=pmt.MOV_ID where pmt.issearch=1 and pmt.MOV_DATE=sysdate and pmt.mov_id not in(select mov_id from pp_code_movs where code_id=1) and instr(pmt.TP_NAMELIST, 电视剧)=0 and instr(pmt.MOV_NAME, (预告片)=0 and instr(pmt.TP_NAMELIST, 综艺)=0 and instr(pmt.TP_NAMELIST, MTV)=0 and instr(pmt.TP_NAMELIST, 时事)=0 and instr(pmt.TP_NAMELIST, 游戏)=0 and instr(pmt.TP_NAMELIST, 动物)=0 and instr(pmt.TP_NAMELIST, 军事)=0 and instr(pmt.TP_NAMELIST, 文化)=0 and instr(pmt.TP_NAMELIST, 旅行)=0 and instr(pm
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 从业资格考试题目设分及答案解析
- 危货从业人员考试资料及答案解析
- 知识问答题库安全常识及答案解析
- 2025年全员网络安全培训考试试题及答案
- 2025年输血相关法律法规试题考核试题及答案
- 2025年保健营养师职业资格考试试卷及答案
- 2025年放射医师考试题及答案新版
- 2025GMP考试试题及参考答案
- 天然气管道安全施工协议书8篇
- 2025年海洋能发电与海水淡化联合系统市场潜力深度研究报告
- 《研究生入学教育》课件
- 汽车行业中的环境保护与可持续发展
- 打起手鼓唱起歌混声合唱简谱
- 空调安装免责协议
- QGW 201175-2019-金风陆上风力发电机组 塔架通用防腐技术规范
- 老友记第一季字幕
- 输电线路风偏计算基本方法
- 骨科概论课件
- 第5章光电成像系统
- GB/T 9117-2010带颈承插焊钢制管法兰
- GB/T 5455-2014纺织品燃烧性能垂直方向损毁长度、阴燃和续燃时间的测定
评论
0/150
提交评论