WHERE子句中的连接顺序
ORACLE采用自下而上的顺序解析WHERE子句根据这个原理表之间的连接必须写在其他WHERE条件之前 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾
例如
(低效执行时间秒)
SELECT…
FROMEMPE
WHERESAL>
ANDJOB=MANAGER
AND<(SELECTCOUNT(*)FROMEMP
WHEREMGR=EEMPNO);
(高效执行时间秒)
SELECT…
FROMEMPE
WHERE<(SELECTCOUNT(*)FROMEMP
WHEREMGR=EEMPNO)
ANDSAL>
ANDJOB=MANAGER;
SELECT子句中避免使用 *
当你想在SELECT子句中列出所有的COLUMN时使用动态SQL列引用 * 是一个方便的方法不幸的是这是一个非常低效的方法实际上ORACLE在解析的过程中 会将* 依次转换成所有的列名 这个工作是通过查询数据字典完成的 这意味着将耗费更多的时间
减少访问数据库的次数
当执行每条SQL语句时 ORACLE在内部执行了许多工作 解析SQL语句 估算索引的利用率 绑定变量 读数据块等等 由此可见 减少访问数据库的次数 就能实际上减少ORACLE的工作量
例如以下有三种方法可以检索出雇员号等于或的职员
方法 (最低效)
SELECTEMP_NAMESALARYGRADE
FROMEMP
WHEREEMP_NO=;
SELECTEMP_NAMESALARYGRADE
FROMEMP
WHEREEMP_NO=;
方法 (次低效)
DECLARE
CURSORC(E_NONUMBER)IS
SELECTEMP_NAMESALARYGRADE
FROMEMP
WHEREEMP_NO=E_NO;
BEGIN
OPENC();
FETCHCINTO…;
OPENC();
FETCHCINTO…;
CLOSEC; END;
方法 (高效)
SELECTAEMP_NAMEASALARYAGRADE
BEMP_NAMEBSALARYBGRADE
FROMEMPAEMPB
WHEREAEMP_NO=
ANDBEMP_NO=;
注意
在SQL*Plus SQL*Forms和Pro*C中重新设置ARRAYSIZE参数 可以增加每次数据库访问的检索数据量 建议值为