进行了显式或隐式的运算的字段不能进行索引,如:
ss_df+20>50,优化处理:
ss_df>30
‘X’||hbs_bh>’X5400021452’,优化处理:
hbs_bh>’5400021542’
sk_rq+5=sysdate,优化处理:
sk_rq=sysdate-5
hbs_bh=5401002554,优化处理:
hbs_bh=’5401002554’,注:
此条件对hbs_bh进行隐式的to_number转换,因为hbs_bh字段是字符型。
条件内包括了多个本表的字段运算时不能进行索引,如:
ys_df>cx_df,无法进行优化
qc_bh||kh_bh=’5400250000’,优化处理:
qc_bh=’5400’andkh_bh=’250000’
应用ORACLE的HINT(提示)处理
提示处理是在ORACLE产生的SQL分析执行路径不满意的情况下要用到的。
它可以对SQL进行以下方面的提示
目标方面的提示:
COST(按成本优化)
RULE(按规则优化)
CHOOSE(缺省)(ORACLE自动选择成本或规则进行优化)
ALL_ROWS(所有的行尽快返回)
FIRST_ROWS(第一行数据尽快返回)
执行方法的提示:
USE_NL(使用NESTEDLOOPS方式联合)
USE_MERGE(使用MERGEJOIN方式联合)
USE_HASH(使用HASHJOIN方式联合)
索引提示:
INDEX(TABLEINDEX)(使用提示的表索引进行查询)
其它高级提示(如并行处理等等)
ORACLE的提示功能是比较强的功能,也是比较复杂的应用,并且提示只是给ORACLE执行的一个建议,有时如果出于成本方面的考虑ORACLE也可能不会按提示进行。
根据实践应用,一般不建议开发人员应用ORACLE提示,因为各个数据库及服务器性能情况不一样,很可能一个地方性能提升了,但另一个地方却下降了,ORACLE在SQL执行分析方面已经比较成熟,如果分析执行的路径不对首先应在数据库结构(主要是索引)、服务器当前性能(共享内存、磁盘文件碎片)、数据库对象(表、索引)统计信息是否正确这几方面分析。
十、Sql常用脚本
十一、关于表重复属性的定义
不能有多择一的重复属性列;
对于能多选的重复属性列,如果不做查询列并且重复次数较多,应使用ID_VARRAY代替,如要用作查询列,重复次数多的,应另建一表,次数少的且列值为二择一时,应使用NUMBER类型,加位操作。
十二、数据修改约定
发现Production环境中数据有误,需要改正的,应在RA TERMINAL上提交数据更新表单,由数据库操作员在当日17时前修改完毕。
数据库更程序更新的结构变动及数据更新,类似处理。
提交SQTT测试需要准备数据或更新结构的,暂时先写入测试请求中,由SQTT同志MAIL(注明测试请求表单链接即可)通过数据库操作员修改数据库。
待内部网TEAM增加新的表单后,测试请求分开提交。
十三、数据库设计流程
在新项目设计阶段会议,应有DBA参加。
在SCHEMA确定以后方可开始编码。
十四、书写优化性能建议
1、避免嵌套连接。
例如:
A=BandB=CandC=D
2、where条件中尽量减少使用常量比较,改用主机变量
3、系统可能选择基于规则的优化器,所以将结果集返回数据量小的表作为驱动表(from后边最后一个表)。
4、大量的排序操作影响系统性能,所以尽量减少orderby和groupby排序操作。
如必须使用排序操作,请遵循如下规则:
(1) 排序尽量建立在有索引的列上。
(2) 如结果集不需唯一,使用unionall代替union。
5、索引的使用。
(1) 尽量避免对索引列进行计算。
如对索引列计算较多,请提请系统管理员建立函数索引。
(2) 尽量注意比较值与索引列数据类型的一致性。
(3) 对于复合索引,SQL语句必须使用主索引列
(4) 索引中,尽量避免使用NULL。
(5) 对于索引的比较,尽量避免使用NOT=(!
=)
(6) 查询列和排序列与索引列次序保持一致
6、尽量避免相同语句由于书写格式的不同,而导致多次语法分析。
7、尽量使用共享的SQL语句。
8、查询的WHERE过滤原则,应使过滤记录数最多的条件放在最前面。
9、任何对列的操作都将导致表扫描,它包括数据库函数、计算表达式等等,查询时要尽可能将操作移至等号右边。
10、in、or子句常会使用工作表,使索引失效;如果不产生大量重复值,可以考虑把子句拆开;拆开的子句中应该包含索引。
三、其他经验性规则
1、尽量少用嵌套查询。
如必须,请用notexist代替notin子句。
如例
(2)
2、用多表连接代替EXISTS子句。
如例(3)
3、少用DISTINCT,用EXISTS代替如例(4)
4、使用UNIONALL、MINUS、INTERSECT提高性能
5、使用ROWID提高检索速度。
对SELECT得到的单行记录,需进行DELETE、UPDATE操作时,使用ROWID将会使效率大大提高。
6、使用优化线索机制进行访问路径控制。
7、使用cursor时,显示光标优于隐式光标
本规范示例:
例一:
SELECTaka042 --单位缴费划入个人帐户比例
INTOprm_aaa043
FROMka01 --医疗保险单位缴费划入个人帐户比例分段信息
WHEREakc021 =rec_kc01.akc021 --医疗人员类别
ANDaka041>=rec_kc01.akc023 --年龄上限
ANDaka040<=rec_kc01.akc023 --年龄下限
ANDaae030<=prm_date --开始时间
AND(aae031>=prm_dateORaae031ISNULL); --终止时间
例二:
X SELECT......
FROMemp
WHEREdept_noNOTIN(SELECTdept_no
FROMdept
WHEREdept_cat='A');
O SELECT......
FROMempe
WHERENOTEXISTS(SELECT'X'
FROMdept
WHEREdept_no=e.dept_no
ANDdept_cat='A');
例三:
X SELECT......
FROMemp
WHEREEXISTS(SELECT'X'
FROMdept
WHEREdept_no=e.dept_no
ANDdept_cat='A');
O SELECT......
FROMempe,deptd
WHEREe.dept_no=d.dept_no
ANDdept_cat='A';
例四:
X SELECTDISTINCTd.dept_code,d.dept_name
FROMdeptd,empe
WHEREe.dept_code=d.dept_code;
O SELECTdept_code,dept_name
FROMdeptd
WHEREEXISTS(SELECT'X'
FROMempe
WHEREe.dept_code=d.dept_code);
关键词列表:
ACCESSDECIMALINITIALONSTART
ADDNOTINSERTONLINESUCCESSFUL
ALLDEFAULTINTEGEROPTIONSYNONYM
ALTERDELETEINTERSECTORSYSDATE
ANDDESCINTOORDERTABLE
ANYDISTINCTISPCTFREETHEN
ASDROPLEVELPRIORTO
ASCELSELIKEPRIVILEGESTRIGGER
AUDITEXCLUSIVELOCKPUBLICUID
BETWEENEXISTSLONGRAWUNION
BYFILEMAXEXTENTSRENAMEUNIQUE
FROMFLOATMINUSRESOURCEUPDATE
CHARFORMLSLABELREVOKEUSER
CHECKSHAREMODEROWVALIDATE
CLUSTERGRANTMODIFYROWIDVALUES
COLUMNGROUPNOAUDITROWNUMVARCHAR
COMMENTHAVINGNOCOMPRESSROWSVARCHAR2
COMPRESSIDENTIFIEDNOWAITSELECTVIEW
CONNECTIMMEDIATENULLSESSIONWHENEVER
CREATEINNUMBERSETWHERE
CURRENTINCREMENTOFSIZEWITH
DATEI