[计算机软件及应用]STQP0505 SQL编码规范.doc

上传人:sccc 文档编号:4561661 上传时间:2023-04-27 格式:DOC 页数:33 大小:528.50KB
返回 下载 相关 举报
[计算机软件及应用]STQP0505 SQL编码规范.doc_第1页
第1页 / 共33页
[计算机软件及应用]STQP0505 SQL编码规范.doc_第2页
第2页 / 共33页
[计算机软件及应用]STQP0505 SQL编码规范.doc_第3页
第3页 / 共33页
[计算机软件及应用]STQP0505 SQL编码规范.doc_第4页
第4页 / 共33页
[计算机软件及应用]STQP0505 SQL编码规范.doc_第5页
第5页 / 共33页
点击查看更多>>
资源描述

《[计算机软件及应用]STQP0505 SQL编码规范.doc》由会员分享,可在线阅读,更多相关《[计算机软件及应用]STQP0505 SQL编码规范.doc(33页珍藏版)》请在三一办公上搜索。

1、SQL编码规范(V0.6)北京神州数码思特奇信息技术股份有限公司二七年八月神州数码思特奇信息技术股份有限公司 地址:北京市海淀区上地九街9号数码科技广场二层(100085)电话 (Tel) :(010) 58856600 传真 (Fax):(010) 62969630 第 2 页 共 61 页SQL编码规范 文档信息文档名称SQL编码规范电子文档SQL编码规范.doc/Microsoft WORD 2000文件状态 草 稿 正式发布 正在修改编 写 人dongjz、yangyun日 期2007年06月27日校 对 人日 期年 月 日审 核 人日 期年 月 日批 准 人日 期年 月 日变更记录变

2、更序号变更原因变更页码变更前版本号变更后版本号更改人批准人生效日期备 注1文档建立0.1 目 录1概述71.1.范围72排版规则81.2.一般规则8规则2.1 独立单元书写规则8规则2.2 块关键字对齐原则8规则2.3 块内缩进原则9规则2.4 TAB/空格一致原则9规则2.5 程序块间隔行规则9规则2.6 IF语句9规则2.7 循环语句9规则2.8 换行规则10规则2.9 空格10规则2.10 大小写规则101.3.E-SQL排版规则11规则2.11 在EXEC SQL语句后加一个TAB键,然后再写SQL语句。11规则2.12 SQL语句的关键字SELECT、FROM、WHERE、AND等,

3、必须尾部对齐。11规则2.13 语句的结束符“;”,放在语句的结束位置,不单独起一行。11规则2.14 SQL语句中不能有注释,如“/*/”、“-”等,注释写在SQL语句的外面。11规则2.15 SQL语句中的对齐方式用空格对齐,SQL语句到“EXEC SQL”之间用TAB对齐。11规则2.16 每个嵌入的EXEC SQL语句,必须单独一行开始。113注释规则12规则3.1 对象注释要求12规则3.2 文件注释12规则3.3 过程与函数的注释12规则3.4 变量注释13规则3.5 参数注释13规则3.6 功能性注释13规则3.7 单行注释144命名规范154.1数据库对象15建议4.1 命名长

4、度和结构15规则4.2 不得出现省市、项目简称15规则4.3 年月日等数字15规则4.4 区分非正式表15规则4.5 命名特例164.2PL/SQL程序块内变量16规则4.6 程序块内变量命名164.3E-SQL源文件17规则4.7:E-SQL源文件命名174.4常用英文缩写字典17规则4.8:业务操作类17规则4.9:业务名词类195SQL程序编码规则215.1PL/SQL程序块21规则5.1 简单函数或过程21规则5.2 不允许使用内嵌函数或过程21规则5.3 复杂函数或过程225.2E-SQL程序22规则5.4 SQL语句出错判断,使用NOTFOUND、SQLOK等宏判断SQL语句是否正

5、确执行。22规则5.5 E-SQL使用自己的出错控制,不使用E-SQL提供的统一出错控制,E-SQL的出错一般设置为无效。22规则5.6 属主变量都要放在SQL定义区统一定义。225.3可读性要求23规则5.7 不允许使用SELECT *23规则5.8 INSERT必须指定插入的字段名23规则5.9 函数及表达式放在等号左边23规则5.10 不等于统一使用23规则5.11 使用表的别名236SQL性能规则与建议246.1性能相关的规则24规则6.1 添加索引提高效率24规则6.2 WHERE子句中不应对索引列使用函数24规则6.3 使用显式的类型转换24规则6.4 为共享SQL语句,要使用绑定

6、变量246.2性能相关的建议25建议6.5 减少子查询的使用25建议6.6 使用DECODE函数来减少处理时间25建议6.7 用UNION替换OR (适用于索引列)26建议6.8 如何删除重复记录26建议6.9 用TRUNCATE替代DELETE删除全表27建议6.10 特大事务多使用COMMIT27建议6.11 用Where子句替换HAVING子句27建议6.12 用EXISTS替代IN28建议6.13 用NOT EXISTS替代NOT IN28建议6.14 用表连接替换EXISTS29建议6.15 用EXISTS替换DISTINCT29建议6.17 避免在索引列上使用计算30建议6.18

7、避免在索引列上使用NOT30建议6.19 用=替代317程序质量保证32规则7.1 运行日志32规则7.2 错误日志32规则7.3 工作日志32规则7.4 异常检查328安全保障338.1PL/SQL安全33规则8.1 DML/DDL语句需说明功能和要求33规则8.2 游标使用结束后必须关闭338.2E-SQL安全33规则8.3 PROC程序中禁止出现用户名和密码338.3数据库操作33规则8.4 DML/DDL操作应显式写明对象属主331 概述制定编码规范的最主要的目的是为了对产出代码的长期维护。通常负责维护代码的人大多都不是开发者本人,如果有一个统一的代码格式以及说明就可以减少混淆提高理解

8、速度。因此,下列的编码规范是基于良好的编码习惯和可读性的原则来制定的。1.1. 范围本规范定义了所有代码编写者在编写SQL程序时应遵守的一些规则和习惯。本规范采用以下术语描述: 规则:编程时强制必须遵守的原则。 建议:编程时必须加以考虑的原则。 说明【 】:对此规则或建议进行必要的解释。 示例:对此规则或建议从正、反两个方面给出例子。2 排版规则1.2. 一般规则规则2.1 独立单元书写规则整个文件,以过程、函数或包为相对独立的单元。在每个单位中,采用以下统一格式:示例:CREATE or REPLACE AS BEGIN EXCEPTION END;即:CREATE、AS、BEGIN、EXC

9、EPTION和END,在第1列。后面的内容,间隔4个空格书写。除非内部处理,否则一律带上EXCEPTION。规则2.2 块关键字对齐原则任何块的关键字,首字母在列上对齐。即:一个程序块内部,标识程序块的关键字开始语句(IF、DO、FOR和BEGIN)、中间语句(ELSIF、EXCEPTION、ELSE)和结束语句(END IF、END LOOP、END),在列位置对齐。规则2.3 块内缩进原则即:一个块下属的内容,从下一行开始,从这个块的标识首字符右移4个空格(或者一个tab键),从第5个列位置开始。规则2.4 TAB/空格一致原则即:一个源文件中,在内容缩进上,要么采用tab方式,要么采用4

10、个空格方式。不能二者并存。规则2.5 程序块间隔行规则SQL程序块之间,采用1行空行分隔。适当时候,可以存在2行空行,不要超过2行(注释行不在此约定范围内)。规则2.6 IF语句IF语句是条件判断语句,只有一个条件的时候,可以不用圆括号。两个以上条件的时候,要求用圆括号(),使得逻辑处理明晰。IF/ELSIF/ELSE/END IF关键字,每个都独立占一行。且每行的开始列位置都相同。特别注意,结束语句END IF后面,有分号。规则2.7 循环语句循环开始语句(FOR、WHILE)跟LOOP语句分行。END LOOP语句,跟LOOP在同一列位置。示例:FOR v_Index IN 1.20LOO

11、P END LOOP;规则2.8 换行规则一行最长不能超过80字符。当超过时,以语意为单位,进行断行,且断行后的内容,缩进书写。示例:- 创建汇总基础表 Create_BaseDat- p_BaseSQL in varchar - SQL 语句- p_sResultTBL in varchar- 结果输出数据表- p_sInfoStr in varchar- 提示信息- 返回值:0记录数Function CReate_BaseData(p_BaseSQL in varchar, p_sResultTBL in varchar, p_sInfoStr in varchar2) RETURN IN

12、T;此外,SELECT/FROM/WHERE/ORDER BY/GROUP BY等子句必须另起一行写。规则2.9 空格SQL内算数运算符、逻辑运算符连接的两个元素之间必须用空格分隔。逗号之后必须接一个空格。关键字、保留字和左括号之间必须有一个空格。规则2.10 大小写规则SQL 语句中出现的系统保留字、内置函数名、SQL保留字、绑定变量等都应大写。1.3. E-SQL排版规则规则2.11 在EXEC SQL语句后加一个TAB键,然后再写SQL语句。规则2.12 SQL语句的关键字SELECT、FROM、WHERE、AND等,必须尾部对齐。规则2.13 语句的结束符“;”,放在语句的结束位置,不

13、单独起一行。规则2.14 SQL语句中不能有注释,如“/*/”、“-”等,注释写在SQL语句的外面。规则2.15 SQL语句中的对齐方式用空格对齐,SQL语句到“EXEC SQL”之间用TAB对齐。示例:E-SQLEXEC SQLSELECT COL1, COL2 FROM tab1 WHERE col1 = ? AND col2 = ?;规则2.16 每个嵌入的EXEC SQL语句,必须单独一行开始。3 注释规则规则3.1 对象注释要求创建每一数据库对象时都要加上COMMENT ON注释,以说明该对象的功能和用途;建表时,对某些数据列也要加上COMMENT ON注释,以说明该列和/或列取值的

14、含义。示例:comment on table RasInfo.TD_UserInfo is 普通地区用户信息表,用于记录除成都外的其他地区的用户信息,按地区分区;comment on column RasInfo.TD_UserInfo.UserCode is 用户编码,主键;规则3.2 文件注释在每个SQL脚本文件的开头,要用块注释,进行文件功能说明,文件编写人、联系方式和文件创建时间说明等。由于PL/SQL语句的特殊性,每行注释前以-为标志。示例:- 收入保障系统 后台数据库脚本- 特殊号码汇总计算程序 dsras_pkgSpecal_CalcSum.SQL- 文本责任人:丁凌风(ding

15、lfsi- )- 2007.02.28 开始创建-规则3.3 过程与函数的注释在每个过程或函数的开头,使用块注释,进行函数功能说明,入口出口参数和返回值说明。示例:- 得到集团用户外部编码。- author lugz- version %I%, %G%- since 1.00- inparam regionCode 地市代码- inparam smCode 业务代码- outparam grpUserNo 集团用户编码- return 返回0表示正确,否则出错!-规则3.4 变量注释对SQL代码中的局部变量,重要的,要进行注释。尤其对Package和OBJECT中的内部全局变量,特别要进行注解

16、。关于变量的注释,采用行尾注释。示例:TYPE RefCursor IS REF CURSOR; - - 定义参考游标类型- 最大欠费用户指标所在地区描述f_AreaName VarChar(20);对常量及变量注释时,应注释被保存值的含义,包括合法取值的范围。规则3.5 参数注释对函数或过程的每个参数进行说明。如果取值范围确定,也一并说明。取值有特定含义的变量(如boolean类型变量),给出每个值的含义。规则3.6 功能性注释对较为复杂的 SQL 语句应注释,并说明算法和功能。应对不易理解的分支条件表达式加注释。对重要的计算应说明其功能。过长的函数实现,应将其语句按实现的功能分段加以概括性

17、说明。规则3.7 单行注释SQL程序中,尽量采用单行注释:-。这样,有利于程序调试时,通过块注释方式,实现大段代码注释。4 命名规范4.1 数据库对象命名对象范围:ORACLE数据库对象,包括表、索引、存储过程、触发器、序列、视图、同义词、数据链路。建议4.1 命名长度和结构对象名不超过30个字符,不低于6个字符,建议在825个左右。由35部分构成,每部分为有一定含义的英文缩写或者数字。每部分建议为34个字符。英文缩写参见“常见缩写字典”。规则4.2 不得出现省市、项目简称不允许出现某省某地市或某项目的简称,例如sc_CustInfo中的sc是不许可的。规则4.3 年月日等数字年月日数字符号,

18、一般应在数据表的尾部。不允许将年月日及其它数字放在对象名的中间。例如,Cust200703Info不许可,CustInfo200703则许可。规则4.4 区分非正式表存在于生产环境的非正式表,如备份表,必须以原表名加前缀bakyymmdd_,以便于识别和及时清理。因此,正式生产表中,最好不要出现BAK、BACK之类的字符串。规则4.5 命名特例编号数据库对象格式范例备注1.全局临时表(golbal temporary table)gTmp_XxxYyyZzz全局临时表属于ORACLE的一种特殊的表类型,不是指临时创建的非正式表2.视图View_XxxYyyZzz3.普通索引Idx_TabNam

19、e_ColumnNameColumnName是该索引第一个字段的简写4.主键索引Idx_TabName_Pk5.同义词必须与原对象名一致若已存在相同的对象名,必须合理调整该冲突对象名或者放弃使用同义词6.触发器Trig_XxxYyyZzz7.存储过程Proc_XxxYyyZzz8.程序包Pkg_ XxxYyyZzz9.函数Func_XxxYyyZzz10.序列Seq_XxxYyyZzz11.数据链路Link_UserName_DbNameDBNAME是指远程数据库的名称,USERNAME是指该远程库的用户名12.分区表中的分区名Part_Xxx4.2 PL/SQL程序块内变量规则4.6 程序块

20、内变量命名全局变量,以g_开头进行命名;包内公用变量,以f_开头命名;过程局部变量,以v_开头命名;参数变量,以p_开头命名;游标变量,以cur_开头命名。4.3 E-SQL源文件规则4.7:E-SQL源文件命名源文件命名规则,一般如下:RXX_XX.pc或者RXX_XX.cp我们以前的E-SQL命令一般都用*.cp,而国际标准一般都用*.pc。特此约定,以前的程序目录沿用*.cp,新的程序目录使用 *.pc命名。文件名以大写字母R开头,后面跟操作代码。操作代码的前两位放在最前面,后面的两位按照顺序放在“_”的后面,如R11_04060820。4.4 常用英文缩写字典规则4.8:业务操作类中文

21、名称英文名称英文缩写读取getget设置setset查询queryqry变更changechg提交、确认confirmcfm冲正、回滚rollbackroll验证validatevali比较comparecmp创建createcrt选择selectsel插入insertins修改updateupd删除deletedel转移transfertran替换replacerpl计算calculatecalc统计statisticstat申请requestreq预约、预订bookbook订购orderord退订cancelcanc打开onon关闭offoff配置configcfg分配allocateal

22、lo结算mediationmed费用feefee发布releaserls跟踪tracetrac清除clearclr稽核auditaud开户、入网openopen业务变更changechg查询queryqry过户Change customerchgCust缴费paymentpay托收contractcon规则4.9:业务名词类中文名称英文名称英文缩写代码codecode类型typetype标识identifierid号码No.no序号seriationser名称namename消息messagemsg信息informationinfo历史historyhis日志loglog密码passwordp

23、sw状态statussta日期datedate时间timetime科目itemitem关系relationrlt组织、机构organizationorg角色rolerole地址addressaddr担保assurerass版本versionver级别levellev电话phoneph合同contractcon发票invoiceinv接口interfaceintf操作oprationop功能functionfunc客户customercust集团groupgrp用户subscribersub帐户accountacc产品productprd服务servicesvc价格pricepri资源resou

24、rceres权限powerpow5 SQL程序编码规则5.1 PL/SQL程序块规则5.1 简单函数或过程单一功能函数或过程(以含注释在内,不超过100行就能解决问题为标准),约定采用独立过程或函数来实现。示例:-是否是一个有效的数值- 参数:- p_NumStr in varchar2 - 字符型数字串- 返回值:- 如果是数值,返回true;否则返回false-CREATE OR REPLACE Function RasInfo.IsNumber(p_NumStr in varchar2) return booleanAS v_Num Number;BEGIN IF p_NumStr IS

25、 NULL THEN return False; END IF; v_Num := To_Number(p_NumStr); Return True;EXCEPTION WHEN OTHERS THEN RETURN False;END;规则5.2 不允许使用内嵌函数或过程尽管ORCALE支持内嵌,但是不允许使用内嵌函数或过程。规则5.3 复杂函数或过程功能比较复杂的函数,不建议使用独立函数或过程的实现。必须使用Package或OBJECT技术来实现。按照功能相近或相似原则,进行package或object的组织。复杂的业务逻辑,采用OBJECT技术来实现。公用的基础功能,采用package技

26、术实现。5.2 E-SQL程序规则5.4 SQL语句出错判断,使用NOTFOUND、SQLOK等宏判断SQL语句是否正确执行。规则5.5 E-SQL使用自己的出错控制,不使用E-SQL提供的统一出错控制,E-SQL的出错一般设置为无效。EXEC SQL WHENEVER SQLERROR CONTINUE;EXEC SQL WHENEVER SQLWARNING CONTINUE;EXEC SQL WHENEVER NOT FOUND CONTINUE;规则5.6 属主变量都要放在SQL定义区统一定义。EXEC SQL BEGIN DECLARE SECTION;char sSql1024;E

27、XEC SQL END DECLARE SECTION;5.3 可读性要求规则5.7 不允许使用SELECT *使用SELECT语句时,不允许使用SELECT *,要使用明确的列名。目的是防止数据字段增加后的影响。规则5.8 INSERT必须指定插入的字段名使用INSERT时,必须指定插入的字段名,主要是考虑以后表结构的变动。规则5.9 函数及表达式放在等号左边应将SQL语句中的数据库函数、计算表达式等放置在等号右边。不要在等号的左边。规则5.10 不等于统一使用Oracle认为!=和是等价的,都代表不等于的意义。为了统一,不等于一律使用表示。规则5.11 使用表的别名多表关联查询,必须使用表

28、的别名。6 SQL性能规则与建议6.1 性能相关的规则规则6.1 添加索引提高效率对大表的操作,业务规范后,必须建立相应的索引,以提高查询效率。规则6.2 WHERE子句中不应对索引列使用函数不要在WHERE子句中,不应该对索引列施以函数,否则该索引将无法使用。规则6.3 使用显式的类型转换不要使用数据库的类型自动转换功能(如数字自动转换为字符串),应使用显式的类型转换。自动转换时往往导致该字段的索引无法使用。规则6.4 为共享SQL语句,要使用绑定变量执行相同操作的SQL语句必须使用相同名字的绑定变量例如:第一组的两个SQL语句,绑定变量是相同的,而第二组中的两个语句绑定变量不同,即使赋于不

29、同的绑定变量相同的值也不能使这两个SQL语句相同,达不到共享SQL语句目的。 a)第一组 select pin , name from people where pin = :blk1.pin; select pin , name from people where pin = :blk1.pin; b)第二组 select pin , name from people where pin = :blk1.ot_ind; select pin , name from people where pin = :blk1.ov_ind; 6.2 性能相关的建议建议6.5 减少子查询的使用子查询除了可

30、读性差之外,还在一定程度上影响了SQL运行效率. 应尽量减少子查询的使用,采用其他效率更高、可读性更好的方式替代。建议6.6 使用DECODE函数来减少处理时间使用DECODE函数可以避免重复扫描相同记录或重复连接相同的表.示例:SELECT COUNT(*),SUM(SAL) FROMEMP WHERE DEPT_NO = 0020 AND ENAME LIKESMITH%; SELECT COUNT(*),SUM(SAL) FROMEMP WHERE DEPT_NO = 0030 AND ENAME LIKESMITH%; 可以用DECODE函数高效地得到相同结果 SELECT COUNT

31、(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子句中建议6.7 用UNION替换OR (适用于索引列)通常情况下, 用UNION替换WHERE子句中的

32、OR将会起到较好的效果. 对索引列使用OR将造成全表扫描. 注意, 以上规则只针对多个索引列有效. 如果有column没有被索引, 查询效率可能会因为你没有选择OR而降低. 在下面的例子中, LOC_ID 和REGION上都建有索引. l 高效: SELECT LOC_ID , LOC_DESC , REGION FROM LOCATION WHERE LOC_ID = 10 UNION SELECT LOC_ID , LOC_DESC , REGION FROM LOCATION WHERE REGION = “MELBOURNE” l 低效: SELECT LOC_ID , LOC_DES

33、C , REGION FROM LOCATION WHERE LOC_ID = 10 OR REGION = “MELBOURNE” 注意: WHERE KEY1 = 10 (返回最少记录) OR KEY2 = 20 (返回最多记录) ORACLE 内部将以上转换为 WHERE KEY1 = 10 AND (NOT KEY1 = 10) AND KEY2 = 20) 建议6.8 如何删除重复记录高效的删除重复记录方法 (因为使用了ROWID)DELETE FROM EMP E WHERE E.ROWID (SELECT MIN(X.ROWID) FROM EMP X WHERE X.EMP_N

34、O = E.EMP_NO);建议6.9 用TRUNCATE替代DELETE删除全表当删除表中的所有记录时,如果不需要恢复,建议使用TRUNCATE而不是DELETE ALL,既不占用回滚段,也能加快速度。建议6.10 特大事务多使用COMMIT在程序中尽量避免特大事务,多使用COMMIT, 这样程序的性能得到提高,也会因为COMMIT所释放的资源而减少。当然要注意,COMMIT次数也不能太频繁,频繁同样会增加数据库负担。建议6.11 用Where子句替换HAVING子句避免使用HAVING子句, HAVING 只会在检索出所有记录之后才对结果集进行过滤. 这个处理需要排序,总计等操作. 如果能

35、通过WHERE子句限制记录的数目,那就能减少这方面的开销.示例:l 低效:SELECT REGION,AVG(LOG_SIZE) FROM LOCATION GROUP BY REGION HAVING REGION != SYDNEY AND REGION != PERTH l 高效:SELECT REGION,AVG(LOG_SIZE) FROM LOCATION WHERE REGION != SYDNEY AND REGION != PERTH GROUP BY REGION 建议6.12 用EXISTS替代IN在许多基于基础表的查询中,为了满足一个条件,往往需要对另一个表进行联接.在

36、这种情况下, 使用EXISTS(或NOT EXISTS)通常将提高查询的效率. 示例:l 低效:SELECT * FROM EMP (基础表) WHERE EMPNO 0 AND DEPTNO IN (SELECT DEPTNO FROM DEPT WHERE LOC = MELB) l 高效: SELECT * FROM EMP (基础表) WHERE EMPNO 0 AND EXISTS (SELECT X FROM DEPT WHERE DEPT.DEPTNO = EMP.DEPTNO AND LOC = MELB) 建议6.13 用NOT EXISTS替代NOT IN无论在哪种情况下,

37、NOT IN都是最低效的 (因为它对子查询中的表执行了一个全表遍历).可以把它改写成外连接(Outer Joins)或NOT EXISTS. 示例:SELECT FROM EMP WHERE DEPT_NO NOT IN (SELECT DEPT_NO FROM DEPT WHERE DEPT_CAT=A); l (方法一: 高效) SELECT . FROM EMP A,DEPT B WHERE A.DEPT_NO = B.DEPT(+) AND B.DEPT_NO IS NULL AND B.DEPT_CAT(+) = A l (方法二: 最高效) SELECT . FROM EMP E

38、WHERE NOT EXISTS (SELECT X FROM DEPT D WHERE D.DEPT_NO = E.DEPT_NO AND DEPT_CAT = A);建议6.14 用表连接替换EXISTS通常来说 , 采用表连接的方式比EXISTS更有效率。 SELECT ENAME FROM EMP E WHERE EXISTS (SELECT X FROM DEPT WHERE DEPT_NO = E.DEPT_NO AND DEPT_CAT = A); l (更高效) SELECT ENAME FROM DEPT D,EMP E WHERE E.DEPT_NO = D.DEPT_NO

39、 AND DEPT_CAT = A ; 建议6.15 用EXISTS替换DISTINCT当提交一个包含一对多表信息(比如部门表和雇员表)的查询时,避免在SELECT子句中使用DISTINCT。一般可以考虑用EXIST替换。示例:l 低效: SELECT DISTINCT DEPT_NO,DEPT_NAME FROM DEPT D,EMP E WHERE D.DEPT_NO = E.DEPT_NO l 高效: SELECT DEPT_NO,DEPT_NAME FROM DEPT D WHERE EXISTS ( SELECT X FROM EMP E WHERE E.DEPT_NO = D.DE

40、PT_NO); 建议6.17 避免在索引列上使用计算WHERE子句中,如果索引列参与计算,优化器将不使用索引而使用全表扫描。示例:l 低效: SELECT FROM DEPT WHERE SAL * 12 25000; l 高效: SELECT FROM DEPT WHERE SAL 25000/12; 建议6.18 避免在索引列上使用NOT避免在索引列上使用NOT, NOT会产生在和在索引列上使用函数相同的影响. 当ORACLE”遇到”NOT,会停止使用索引转而执行全表扫描。示例:l 低效: (不使用索引) SELECT FROM DEPT WHERE NOT DEPT_CODE = 0;

41、l 高效: (使用了索引) SELECT FROM DEPT WHERE DEPT_CODE 0; 需要注意的是,在某些时候, ORACLE优化器会自动将NOT转化成相对应的关系操作符。NOT to = to NOT = NOT 建议6.19 用=替代如果DEPTNO上有一个索引, l 高效: SELECT * FROM EMP WHERE DEPTNO =4 l 低效: SELECT * FROM EMP WHERE DEPTNO 3 两者的区别在于, 前者DBMS将直接跳到第一个DEPT等于4的记录而后者将首先定位到DEPTNO=3的记录并且向前扫描到第一个DEPT大于3的记录。7 程序质量保证规则7.1 运行日志是指SQL运行点的输出日志。要求程序一定要使用日志语句,在运行过程输出。日志的输出,可以是数据表,或者通过Java函数,或者UT_FILE包,书写到操作系统文件。运行日志必须设置调试开关,在生产环境有效屏蔽其在开发测试环境输出的日志。规则7.2 错误日志系统容错处理的日志,一定要与

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 教育教学 > 成人教育


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号