资源描述:
《SQL编写规范与优化(适用于Oracle)》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、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语句
2、中的关键字右对齐。select/from/where/orderby/groupby等子句应独占一行。select子句内容如果只有一项,应与select同占一行。select子句内容如果多于一项,每一项都应独占一行,并在对应select的基础上向右缩进8个字符。from子句内容如果只有一项,应与from同占一行。from子句内容如果多于一项,每一项都应独占一行,并在对应from的基础上向右缩进4个字符。where子句内容如果只有一项,应与where同占一行。where子句的条件如果有多项,每一个条件应独占一行,并以a
3、nd开头,并在对应where的基础上向右缩进4个字符。updateset子句内容每一项单独占一行,无缩进。insert子句内容每个表字段单独占一行,无缩进;values每一项单独占一行,无缩进。SQL语句缩进与换行示例:--select语句书写的正确示例1、selectcolumn_namefromtable_namewherecolumn_name=’xxxxxxxxx’;2、selecta.column1,a.column2,b.column3fromtable_name_1a,table_name_2bwher
4、ea.column1=b.column2andb.stat=2;--update语句书写的正确示例updatetable_namesetlist_stat=‘xxx’,parent=‘xxx’,name=‘xxx’wherelist_no=‘xxx‘andcity=‘xxx’;--Insert语句书写的正确示例insertintotable_name(list_no,list_stat,parent,manifest_no,div_flag)values('bill020','1','0','000000000000
5、007807','0');2.3、SQL语句编写应遵循以下空格规则1.SQL语句中不允许出现空行。2.SQL语句内的算术运算符、逻辑运算符(AND、OR、NOT)、比较运算符(=、<=、>=、>、<、<>、BETWEENAND)、IN、LIKE等运算符前后都应加一空格。3.逗号之后必须接一个空格。4.关键字、保留字和左括号之间必须有一个空格。三、SQL语句编写规范1、表结构设计的时候尽量选择合适的数据类型、合适的长度、避免行链接、行迁移的出现,外键所在的字段一定要创建索引,否则,对主表进行操作,外键所在的子表有可能被
6、完全封锁。2、SQL语句的语法应与所使用的数据库相适应。3、关键SQL语句,尽量简化,不要包含太多的嵌套,避免执行计划错误的可能,原则上不能超过2层。4、SQL语句包含多表连接时,建议使用表别名,对每个字段的使用都要带上表别名,例如:selecta.col1,a.col2,b.col3fromtable_namea,tablebbwherea.col4=b.col5;5、多表关联避免超过5个,可以通过临时表(表变量),简化复杂的关联。6、使用SELECT语句时,禁止使用select*,应当指出具体查询的字段名,例如:
7、selectcol1,col2,col3,…fromtable_name;。7、使用INSERT语句时,禁止使用insertintotable_namevalues(?,?,?),不应不指定字段名直接插入VALUES,应指定插入的字段名,例如:insertintotable_name(col1,col2,…)values(?,?,…)8、避免在where使用'1=1','1=2'这种表达式作为部分条件,例如:selectcol1,col2fromtable_namewhere1=1andcol1>0。9、字符型字段必
8、须加单引号,避免where查询条件做隐型转换时后出现混乱。10、SQL语句的注释:应遵循各语言编码规范的代码注释要求。对较为复杂的SQL语句应注释,并说明算法和功能。对重要的计算应说明其功能。四、SQL语句编写过程中的优化建议应用逻辑复杂时,使用SQL实现困难,尽量使用程序去实现。建议使用hint固定关键SQL语句执行计划,原则上批量作业要用h