在其他WHERE条件之前那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾例如低效执行时间1563秒SELECT…FROMEMPEWHERESAL50000
fANDAND
JOB‘MANAGER’25SELECTCOUNTFROMEMPWHEREMGREEMPNO
高效执行时间106秒SELECT…FROMEMPEWHERE25SELECTCOUNTFROMEMPWHEREMGREEMPNOANDANDSAL50000JOB‘MANAGER’
6SELECT子句中避免使用‘‘当你想在SELECT子句中列出所有的COLUMN时使用动态SQL列引用‘’是一个方便的方法不幸的是这是一个非常低效的方法实际上ORACLE在解析的过程中会将’’依次转换成所有的列名这个工作是通过查询数据字典完成的这意味着将耗费更多的时间7减少访问数据库的次数当执行每条SQL语句时ORACLE在内部执行了许多工作解析SQL语句估算索引的利用率绑定变量读数据块等等由此可见减少访问数据库的次数就能实际上减少ORACLE的工作量例如以下有三种方法可以检索出雇员号等于0342或0291的职员方法1最低效SELECTEMP_NAMESALARYGRADEFROMEMPWHEREEMP_NO342SELECTEMP_NAMESALARYGRADEFROMEMPWHEREEMP_NO291方法2次低效DECLARE
fCURSORC1E_NONUMBERISSELECTEMP_NAMESALARYGRADEFROMEMPWHEREEMP_NOE_NOBEGINOPENC1342FETCHC1INTO…OPENC1291FETCHC1INTO…CLOSEC1END方法3高效SELECTAEMP_NAMEASALARYAGRADEBEMP_NAMEBSALARYBGRADEFROMEMPAEMPBWHEREAEMP_NO342AND注意注意在SQLPlusSQLForms和ProC中重新设置ARRAYSIZE参数可以增加每次数据库访问的检索数据量建议值为2008使用DECODE函数来减少处理时间使用DECODE函数可以避免重复扫描相同记录或重复连接相同的表例如SELECTCOUNT,SUMSALFROMEMPWHEREDEPT_NO0020ANDENAMELIKE‘SMITH’BEMP_NO291
SELECTCOUNT,SUMSALFROMEMPWHEREDEPT_NO0030
fANDENAMELIKE
‘SMITH’
你可以用DECODE函数高效地得到相同结果SELECTCOUNTDECODEDEPT_NO0020’X’NULLD0020_COUNTCOUNTDECODEDEPT_NO0030’X’NULLD0030_COUNTSUMDECODEDEPT_NO0020SALNULLD0020_SALSUMDECODEDEPT_NO0030SALNULLD0030_SALFROMEMPWHEREENAMELIKE‘SMITH’类似的DECODE函数也可以运用于GROUPBY和ORDERBY子句中9整合简单无关联的数据库访问整合简单无关联的数据库访问如果你有几个简单的数据库查询语句你可以把它们整合到一个查询中即使它们之间没有关系例如SELECTNAMEFROMEMPWHEREEMP_NO1234
SELECTNAMEFROMDPTWHEREDPT_NO10
SELECTNAMEFROMCATWHERECAT_TYPE‘RD’上面的3个查询可以被合并成一个SELECTENAMEDNAMECNAMEFROMCATCDPTDEMPEDUALXWHEREr