数据库

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

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


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

SQL 能否共享 原因

select max(sal_cap) from sal_limit; 不能 每个用户都有一个private synonym sal_limit 它们是不同的对象

select count(* from work_city where sdesc like NEW%; 能 两个用户访问相同的对象public synonym work_city

select asdescblocation from work_city a plant_detail b where acity_id = bcity_id 不能 用户jack 通过private synonym访问plant_detail 而jill 是表的所有者对象不同

C 两个SQL语句中必须使用相同的名字的绑定变量(bind variables)

例如第一组的两个SQL语句是相同的(可以共享)而第二组中的两个语句是不同的(即使在运行时赋于不同的绑定变量相同的值)

a

selectpinnamefrompeoplewherepin=blkpin;

selectpinnamefrompeoplewherepin=blkpin;

b

selectpinnamefrompeoplewherepin=blkot_ind;

selectpinnamefrompeoplewherepin=blkov_ind;

选择最有效率的表名顺序(只在基于规则的优化器中有效)

ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名因此FROM子句中写在最后的表(基础表 driving table)将被最先处理 在FROM子句中包含多个表的情况下你必须选择记录条数最少的表作为基础表当ORACLE处理多个表时会运用排序及合并的方式连接它们首先扫描第一个表(FROM子句中最后的那个表)并对记录进行派序然后扫描第二个表(FROM子句中最后第二个表)最后将所有从第二个表中检索出的记录与第一个表中合适记录进行合并

例如

表 TAB 条记录

表 TAB 条记录

选择TAB作为基础表 (最好的方法)

selectcount(*)fromtabtab执行时间

选择TAB作为基础表 (不佳的方法)

selectcount(*)fromtabtab执行时间

如果有个以上的表连接查询 那就需要选择交叉表(intersection table)作为基础表 交叉表是指那个被其他表所引用的表

例如 EMP表描述了LOCATION表和CATEGORY表的交集

SELECT*

FROMLOCATIONL

CATEGORYC

EMPE

WHEREEEMP_NOBETWEENAND

ANDECAT_NO=CCAT_NO

ANDELOCN=LLOCN

将比下列SQL更有效率

SELECT*

FROMEMPE

LOCATIONL

CATEGORYC

WHEREECAT_NO=CCAT_NO

ANDELOCN=LLOCN

ANDEEMP_NOBETWEENAND

上一篇:配置OracleEnterpriseManager过程总结

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