数据库

位置:IT落伍者 >> 数据库 >> 浏览文章

Oracle语句优化30个规则详解(3)


发布日期:2022年11月09日
 
Oracle语句优化30个规则详解

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参数 可以增加每次数据库访问的检索数据量 建议值为

上一篇:配置OracleEnterpriseManager过程总结

下一篇:Oracle 10g学习手册2:安装与构建三(图)