




已阅读5页,还剩18页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
SQL编写规范与优化,皮皮网运维部2012.10,一、概述,本规范侧重于代码编写过程中SQL语句的编写规范问题,内容涉及编写风格、编写规范、SQL语句编写过程中的优化建议、不良SQL语句的优化等方面。,二、SQL编写风格,2.1、SQL语句的大小写SQL语句的关键字统一使用全小写或全大写的方式,例如:select,update,from,where,order,by,groupbydeclare,begin,end等。标识符,变量和参数采用小写,如v_sal。数据库对象、列以及别名用小写。,2.2、SQL语句缩进与换行sql语句中的关键字右对齐。select/from/where/orderby/groupby等子句应独占一行。select子句内容如果只有一项,应与select同占一行。select子句内容如果多于一项,每一项都应独占一行,并在对应select的基础上向右缩进8个字符。from子句内容如果只有一项,应与from同占一行。from子句内容如果多于一项,每一项都应独占一行,并在对应from的基础上向右缩进4个字符。where子句内容如果只有一项,应与where同占一行。where子句的条件如果有多项,每一个条件应独占一行,并以and开头,并在对应where的基础上向右缩进4个字符。updateset子句内容每一项单独占一行,无缩进。insert子句内容每个表字段单独占一行,无缩进;values每一项单独占一行,无缩进。,SQL语句缩进与换行示例:-select语句书写的正确示例1、selectcolumn_namefromtable_namewherecolumn_name=xxxxxxxxx;2、selecta.column1,a.column2,b.column3fromtable_name_1a,table_name_2bwherea.column1=b.column2andb.stat=2;,-update语句书写的正确示例updatetable_namesetlist_stat=xxx,parent=xxx,name=xxxwherelist_no=xxxandcity=xxx;,-Insert语句书写的正确示例insertintotable_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)、比较运算符(=、=、BETWEENAND)、IN、LIKE等运算符前后都应加一空格。3.逗号之后必须接一个空格。4.关键字、保留字和左括号之间必须有一个空格。,三、SQL语句编写规范,1、表结构设计的时候尽量选择合适的数据类型、合适的长度、避免行链接、行迁移的出现,外键所在的字段一定要创建索引,否则,对主表进行操作,外键所在的子表有可能被完全封锁。2、SQL语句的语法应与所使用的数据库相适应。3、关键SQL语句,尽量简化,不要包含太多的嵌套,避免执行计划错误的可能,原则上不能超过2层。4、SQL语句包含多表连接时,建议使用表别名,对每个字段的使用都要带上表别名,例如:selecta.col1,a.col2,b.col3fromtable_namea,tablebbwherea.col4=b.col5;5、多表关联避免超过5个,可以通过临时表(表变量),简化复杂的关联。,6、使用SELECT语句时,禁止使用select*,应当指出具体查询的字段名,例如:selectcol1,col2,col3,fromtable_name;。7、使用INSERT语句时,禁止使用insertintotable_namevalues(?,?,?),不应不指定字段名直接插入VALUES,应指定插入的字段名,例如:insertintotable_name(col1,col2,)values(?,?,)8、避免在where使用1=1,1=2这种表达式作为部分条件,例如:selectcol1,col2fromtable_namewhere1=1andcol10。9、字符型字段必须加单引号,避免where查询条件做隐型转换时后出现混乱。10、SQL语句的注释:应遵循各语言编码规范的代码注释要求。对较为复杂的SQL语句应注释,并说明算法和功能。对重要的计算应说明其功能。,四、SQL语句编写过程中的优化建议,应用逻辑复杂时,使用SQL实现困难,尽量使用程序去实现。建议使用hint固定关键SQL语句执行计划,原则上批量作业要用hint指定索引;在进行多条记录的增加、修改、删除时,建议使用批量提交,降低事务的提交频度。SQL语句要绑定变量实现SQL语句的共享,禁止使用常量。对于分区表的查询,原则上使用分区键做条件;,尽量避免多表关联查询、特别是表之间的嵌套连接。尽量使用exists、notexists替代in、notin(大部份情况下exists、notexists的性能都比in、notin好)。使用union的时候如果没有去除重复数据的要求,建议尽量用unionall替代。尽量避免使用orderby和groupby排序操作,因为大量的排序操作影响系统性能。如必须使用排序操作,尽量建立在有索引的列上。索引的建立应慎重考虑,不是越多越好。索引可以提高相应的select的效率,但同时也降低了INSERT、UPDATE的效率。Where条件中的索引列应避免使用,not、isnull,isnotnull、likke%xxxx%,%xxx,oracle系统函数。,开发人员对自己编写的SQL语句,要能够简单的评估自己所写语句的执行计划,避免显而易见的问题:比如说数据类型的隐式转换,大表上的全表扫描,对大表进行多次扫描等等。怎样生成执行计划,在SQL*PLUS里面可以通过setautotraceon或setautotracetraceonlyexplain生成,在PL/SQLDeveloper工具里面直接按键盘上面的F5。,五、不良sql语句优化,例1:不合理的执行计划,导致cpu使用率过高.selectcount(*)asrCountfrom(select*fromPPFILM_COFIGwhereSIDnotin(selectMOV_IDfrompp_code_movswhereCODE_ID=3)orderbyidxdesc)temp;RCOUNT-646Elapsed:00:00:21.08,执行计划,问题说明:ppfilm_config表中的记录为1192,pp_code_movs记录为76844存在不必要的嵌套和排序操作(造成不合理执行计划的出现),书写不规范。语句在执行的时候逻辑读过高,占用大量的CPU资源(不合理的执行计划造成)。语句在解析的时候会将notin转换成Notexists,解决方法去除嵌套和排序、使用notexists替代notin优化后的语句如下:selectcount(*)fromppfilm_cofigpgwherenotexists(selectmov_idfrompp_code_movspswhereps.code_id=3andpg.sid=ps.mov_id);COUNT(*)-646Elapsed:00:00:00.01,6、优化之后的执行计划和统计信息,例2:select*导致不必要的输入输出,例2问题说明:pmt这张表有45个字段,实际查询需求只需要4个字段,使用”select*”导致大量的不必输入输出。,selectpmt.*,to_char(pmt.MOV_LASTMODIFY,yyyy-mm-ddhh24:mi:ss)MOV_LASTMODIFY,to_char(pmt.MOV_DATE,yyyymmddhh24miss)UPDATE_TIME,pmi.MOV_AVG_LEVEL,pmi.MOV_MARKCONUT,pmi.MOV_REVIEWCOUNTfrompp_movies_info_tabpmiinnerjoinpp_movies_tabpmtonpmi.MOV_ID=pmt.MOV_IDwherepmt.issearch=1andpmt.MOV_DATE=sysdateandpmt.mov_idnotin(selectmov_idfrompp_code_movswherecode_id=1)andinstr(pmt.TP_NAMELIST,电视剧)=0andinstr(pmt.MOV_NAME,(预告片)=0andinstr(pmt.TP_NAMELIST,综艺)=0andinstr(pmt.TP_NAMELIST,MTV)=0andinstr(pmt.TP_NAMELIST,时事)=0andinstr(pmt.TP_NAMELIST,游戏)=0andinstr(pmt.TP_NAMELIST,动物)=0andinstr(pmt.TP_NAMELIST,军事)=0andinstr(pmt.TP_NAMELIST,文化)=0andinstr(pmt.TP_NAMELIST,旅行)=0andinstr(pmt.T
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 物业服务企业绩效考核实施方案
- 2025年游戏开发行业招聘面试模拟题集及答案解析
- 2025年金融投资从业者必-备资质考试预测试题及答案
- 危废泄漏专项应急处理方案(范文示范)
- 2025年融媒体编辑笔试题目解析
- 2025年道路运输企业安全生产管理人员作业考试题库(附答案)
- 2025年注册验船师资格考试(A级船舶检验专业基础环境与人员保护)测试题及答案一
- 2026届海南省儋州市一中高一化学第一学期期中教学质量检测模拟试题含解析
- 2025年可持续发展与环境管理考试试题及答案
- 合肥公务员面试题及答案
- 患者清洁卫生护理
- 卫生院服务基层行3.5.3 手卫生管理
- 跌倒护理RCA案例汇报
- 2025年图书管理员职称考试试题及答案
- 船厂安全课件
- 2025村后备干部考试题库(含答案)
- 安全生产考核巡查办法全文
- 中国古诗词歌曲课件
- 燃气电气火灾培训课件
- 钻孔桩安全培训
- 对外经贸大学2025年硕士研究生招生专业目录
评论
0/150
提交评论