ORACLESQL编写规范(v1.1).ppt
《ORACLESQL编写规范(v1.1).ppt》由会员分享,可在线阅读,更多相关《ORACLESQL编写规范(v1.1).ppt(48页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、ORACLESQL编写规范编写规范v1.12012年11月武明明技术规划部 数据库组2 1.1.SQL(PL/SQL)编码格式规范u统一的SQL编码格式规范不但可以使阅读者感到清晰明了,而且可以最大程度上避免同一SQL语句在不同地方处理时由于书写格式的不统一,而造成无法共享从而增加SQL解析负担的问题。比如,如下的三条SQL,其达到的目的是一样的,但是在ORACLE看来这是三条完全不同的语句,所以要进行三次硬解析。select*fromemployeeswheredepartment_id=60;SELECT*FROMEMPLOYEESWHEREDEPARTMENT_ID=60;select/
2、*+PARALLEL*/*fromemployeeswheredepartment_id=60;对于联机交易型系统来说,SQL的软解析率是非常关注的一个指标。而引起SQL不能共享的主要因素包括:大小写、空格、注释、提示等。31.SQL(PL/SQL)编码格式规范一些第三方开发工具,例如TOAD等,都有比较好的格式化功能,大家可以用其做风格统一和美化使用,以下是自定义的一套规范,可以供大家参考。u大小写风格大小写风格所有数据库的关键字和保留字均使用大写,对象名称、列名称则使用小写。u缩进风格缩进风格程序块以及SQL均采取统一的缩进风格书写,保持代码的清晰易懂,风格一致,缩进格式保持2到4个。缩进
3、使用空格,而不要使用【Tab】键。当一条SQL中的谓词和子句比较多时,尽量断开成多行,可以采用使子句开头保持一行的方式,谓词关键字保持右侧对齐,左侧缩进的方式。IFflag=1THENSELECTusernameINTOv_userinfoFROMuserinfoWHEREuserid=:iuserid;ENDIF;u空格及换行空格及换行不允许把多个语句写在一行,即一行只写一条语句;避免将复杂的语句写在同一行,建议在谓词和关键字处换行;相对独立的程序块之间必须加空行;BEGIN、END独立成行;太长的表达式应在低优先级操作符处换行,操作符或关键字放在新行之首,划分出新行应适当地缩进,使排列整齐
4、,语句可读;1.SQL(PL/SQL)编码格式规范1.SQL(PL/SQL)编码格式规范不同类型的操作符混合使用时,建议使用括号进行隔离,以使代码清晰;减少控制语句的检查次数,例如,在IFELSE控制语句中,应将最常用的符合条件前置以被检查到。DECLARE-定义局部变量vFlagVARCHAR2(10);-判断标志.BEGINIF(a=bANDa=cANDa=d)OR-在OR处断行,可使得逻辑更为清晰(a=eANDe=f)THEN-处理部分IFvFlag=1THEN-vFlag=1为经常出现的条件,可有效减少判断检查次数-处理部分ELSIFvFlag=2THEN-vFlag=2为次之出现的条
5、件-处理部分ELSE-处理部分ENDIF;END;2.ANSI SQL标准规范1989年,美国国家标准协会(ANSI)第一次发布了SQL标准规范,92年被修订,简称SQL-92,目前这个标准为SQL-99。各主要数据库厂商均宣布支持该标准,但因历史遗留问题,大多也有一些各自的特性在产品中。如果我们在SQL编写规范上面做到符合ANSI的标准,在产品向不同的数据库平台移植的过程中就不会遇到由于某一产品的特殊语法与其他产品不兼容而需要调整的问题。ORACLE由于早于ANSI有一套SQL语法定义方式,其与ANSI的不同主要体现在“关联”(JOIN)语句的书写方式上。一些使用过ORACLE老版本的SQL
6、编码人员还是非常习惯于ORACLE那套老的书写方式。是否使用ANSISQL规范并非强制,可以由项目管理人员决定。如果考虑向不同数据库平台做移植时减少兼容性带来的问题,可以参考一下此规范。2.ANSI SQL标准规范为了对比上的清晰,分别列出ORACLE老版本上的书写方式(也称ORACLE方言)与ANSI规范的主要不同之处。u交叉连接(CROSSJOIN),也称笛卡尔连接,是指不限定关联条件的连接ORACLE方言写法:SELECT*FROMinstructor,course;ANSI写法:SELECT*FROMinstructorCROSSJOINcourse;2.ANSI SQL标准规范u等价
7、连接(EQUIJOIN),也称内连接(INNERJOIN)或规则连接(REGULARJOIN),是指表间有等价连接条件的连接方式。ORACLE方言写法:SELECTs.first_name,s.last_name,z.zip,z.city,z.stateFROMstudents,zipcodezWHEREs.zip=z.zip;ANSI写法1:SELECTs.first_name,s.last_name,z.zip,z.city,z.stateFROMstudentsJOINzipcodezON(s.zip=z.zip);2.ANSI SQL标准规范ANSI写法2:SELECTs.first_
8、name,s.last_name,zip,z.city,z.stateFROMstudentsJOINzipcodezUSING(zip);注意注意:ANSI写法中没有使用WHERE语句列出连接条件,而是使用了ON或者USING子句。在使用USING子句的方式中,SELECT语句针对表间连接字段是不能用别名加限定的,如例中的zip字段。102.ANSI SQL标准规范多表连接的ORACLE方言写法:SELECTs.section_no,c.course_no,c.description,i.first_name,i.last_nameFROMcoursec,sections,instructo
9、riWHEREs.course_no=c.course_noANDi.instructor_id=s.instructor_id多表连接的ANSI写法:SELECTs.section_no,c.course_no,c.description,i.first_name,i.last_nameFROMcoursecJOINsectionsON(s.course_no=c.course_no)JOINinstructoriON(i.instructor_id=s.instructor_id);2.ANSI SQL标准规范u外连接(OUTERJOIN)ORACLE的方言写法:使用(+)来实现外连接SE
10、LECTi.first_name,i.last_name,z.stateFROMinstructori,zipcodezWHEREi.zip(+)=z.zipGROUPBYi.first_name,i.last_name,z.state;ANSI标准写法:使用RIGHT(LEFT)OUTERJOINON来实现外连接SELECTi.first_name,i.last_name,z.stateFROMinstructoriRIGHTOUTERJOINzipcodezONi.zip=z.zipGROUPBYi.first_name,z.state;3.提示(HINT)的书写注意提示的作用主要是SQL
11、编写人员将自己对执行计划的意愿做表达的一种方式,同时也是稳定执行计划的一种最简单的手段。但在提示的写法上要有一定的注意,不正确的提示放置位置可能会使优化器将其忽略从而失去了其存在的意义。SELECT/*+MERGE(v)*/e1.last_name,e1.salary,v.avg_salaryFROMemployeese1,(SELECT/*+INDEX(e2 idx_employees)*/department_id,avg(salary)avg_salaryFROMemployeese2GROUPBYdepartment_id)vWHEREe1.department_id=v.depart
12、ment_idANDe1.salaryv.avg_salary;INSERT/*+APPEND*/INTObig_emp(department_id)SELECTdepartment_idFROMemployees;3.提示(HINT)的书写注意u提示中的+不能少,如果少了,会被优化器当做注释来处理。u提示必须跟在语句的第一个关键字后面,如第二个语句中如果在INTO关键字后面放置提示的话,将会被优化器忽略。u如需要写多个提示,则可以合在一起,中间使用空格隔开。u提示中所引用的表如果定义了别名,则提示中必须引用别名,否则该提示也起不到作用。4.尽量避免笛卡尔连接产生笛卡尔连接的原因就是在多张表进
13、行关联的操作中缺少了表间的连接条件。由于笛卡尔积产生的结果集将是多表记录的乘积关系,因此当哪怕只有一张表的记录数比较大时,其结果集都将被数倍以上地放大,这势必给数据库性能带来严重影响。因此,除一些特殊原因外,要尽量避免笛卡尔连接的产生,也就是说在写关联语句时要严格检查连接条件是否有遗漏。请编码及检查人员注意,不带连接条件的多表连接语句是严格禁止的,如果有则必须要说明原因。5.语句中尽量避免使用*当对表中的所有字段不做筛选地全选择时,可以使用*来替代所有字段。但这样做有两个缺点,一是ORACLE优化器在执行SQL前有一步是查询转换,这种情况将会被改写以具体的字段来替代*,查询转换的操作势必要加重
14、语句处理的负担。二是这种省事的方式可能会使编码人员忽略检查是否有必要查询表中的所有字段,而在优化SQL中有一条原则就是尽量避免多余部分被处理。所以说,不使用*,并且认真检查所提取的每一个字段都是否有必要将是严谨而避免低效的方法。INSERT语句中列出具体的字段还有一个好处就是可以避免当表结构发生变化时产生编译性的错误。6.使用TRUNCATE替代不含过滤条件的DELETE不带WHERE语句的DELETE,其作用相当于全删除操作。如果表的记录数比较多,速度将比较慢,可以使用TRUNCATE语句来替代,TRUNCATE是DDL语句,直接截断表的空间存储与表定义之间的关系。因为是字典一级的操作,所以
15、速度会非常快,而且无论表记录数的多少,正常情况下TRUNCATE语句都会在数秒内完成。但要注意其与DELETE操作的区别是不需要提交操作,且无法回滚。TRUNCATE操作可以针对表以及表分区级,在对分区数据做清理时还是非常有用的。7.FOR UPDATE语句使用注意FORUPDATE语句的作用在于并发环境下,某用户将查询到的数据加锁,以便后续的操作过程中,该数据不会被其他用户所修改,这通常用于一些公共模块的公共处理场景。由于锁定操作势必会影响到并发性,所以原则就是尽量把条件限定严格,使锁定的记录数最少,并且在后续的操作完成后尽快提交或回滚事务,以便其他用户能尽快得到锁资源。除特殊原因外,严格禁
16、止不加过滤条件的SELECT语句中使用FORUPDATE子句。8.提交语句(commit)使用的原则事务设计中,为了保证事务的完整性和有效性必然使用到提交语句。但提交语句在使用上也有一些需要注意的地方。u必须及时提交。这主要是针对高并发的联机事务型(OLTP)数据库所考虑的,因为提交会使本事务所锁定的资源释放给其它事务,以提高并发性。锁的设计是并发联机事务所必须要考虑的东西,提交操作又是其中最重要的部分之一。u提交的动作不宜过于频繁。在不违背第一条原则的前提下,提交又不宜过于频繁。比如一些循环语句的内部。这一点主要是从性能角度所考虑的。因为提交动作本身会使ORACLE后台产生一系列操作,将会消
17、耗掉很大的系统资源。究竟循环处理多少条做一次提交,需要做一些对比测试来最终决定,但过于频繁的提交必定会影响整体性能。8.提交语句(commit)使用的原则u提交操作也不宜过少。这一条是相对于第二条原则而言的。处理的数据量过大而不做提交的话,会消耗比较大的数据库回滚段,甚至有可能导致“回滚段不足”的系统级错误发生。因此在处理数据量过大的情况时,中间完全不提交而只是等到最后才做提交的方式也是需要慎重评估和考虑的。最重要的还是做性能与可靠性的综合测试来确定大数据量处理中提交的位置与频率。9.9.子查询语句与关联语句的转换ORACLE优化器做查询转换这一步时通常会将用户所编写的子查询语句改写为关联语句
18、,因为在很多情况下关联方式效率要高于子查询方式。因此,我们在编写SQL语句时尽量将子查询语句改写成关联语句。10.关联表个数限制的基本原则在报表数据库或批处理数据库中经常会有需要关联多张表做查询的操作,而这些表有的可能会是大表。过多的表做关联可能给性能带来严重的影响,因此,原则上关联表的个数规定不超过4个。如果不能满足这个限定条件,可以考虑如下的两种处理方式:u对于经常被关联使用的个别字段,可以考虑在一边增加冗余字段的方式来减少关联,这是一种反范式化的处理方式,但经常被用于报表查询类型的系统中。增加冗余字段的方式会给数据导入或表插入操作带来负载上的增加,因此这种方式也要综合评估和取舍。u使用中
19、间结果落地的方式。这种方式就是将原来一个SQL完成的操作拆开成多个SQL进行,将某两张或三张表的关联结果先取出,然后再拿结果集与剩下的表继续做关联,得到最终完整的结果。在做分拆过程中表的选取时要遵循的一个原则是,分拆出的两个或多个SQL其处理的结果集要尽量均衡,否则就使分拆的作用打了折扣。11.列放置顺序的原则在设计时,表中各个列的放置顺序要有一定的考虑。通常情况是按照操作的频繁程度为判定,操作频繁的列尽量往前放置,因为放置越靠前的列其处理的整体效率是越高的。12.表及分区表的类型u堆表(HEAP)默认类型,适合于大多数情况u索引组织表(IOT)以B*Tree索引的形式组织表,适合于只按照主键
20、进行查询的数据u簇表(CLUSTER)以簇结构建表并组织数据,适合于经常被关联使用的表u外部表(EXTERNAL)方便使用数据库直接处理库外的文本文件数据u全局临时表(GLOBALTEMPORARY)放置事务处理过程中的数据且可以做到隔离u高级队列表(AQ)建AQ时系统自动创建并维护12.表及分区表的类型uORALCE10G中的分区表类型:列表LIST适合于有限分布的固定值,比如机构名称范围RANGE适合于范围取值,比如时间哈希HASH适合于不好分类的情形,如序列产生的号码组合RANGE-LIST组合RANGE-HASHuORALCE11G中增加的分区表类型:组合RANGE-RANGE组合LI
21、ST-LIST组合LIST-RANGE组合LIST-HASH13.索引的类型与选择uB树索引(B*Tree)默认类型,适用范围最广降序索引适用于字段上还需要做降序排序反向关键字索引减少类似SEQUENCE生成数据时其索引上的热块冲突函数索引过滤字段上有函数或隐含转换函数u位图索引(BITMAP)低基数字段,且表的修改非常少的情况u全文索引用于搜索词汇信息等特殊情景,较少使用索引要在做过滤的字段上考虑,但总体原则是注意选择性,选择性如果超过10%则要慎重考虑,超过20%则不要建立索引。如果有多个过滤字段,可以考虑组合索引,但要将选择性强的字段放在前面。如果查询字段较少,且与过滤字段接近,则可以考
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ORACLESQL 编写 规范 v1
限制150内