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