关联查询的开销——对返回到父查询的的记录来说,子查询会每行执行一次。因此,我们必须保证任何可能的时候子查询用到索引。
2、XISTS子句和IN子句
带IN的关联子查询是多余的,因为IN子句和子查询中相关的操作的功能是一样的。如:
select staff_name from staff_member where staff_id in (select staff_id from staff_func where staff_member.staff_id=staff_func.staff_id);
为非关联子查询指定EXISTS子句是不适当的,因为这样会产生笛卡乘积。如:
select staff_name from staff_member where staff_id
Exists (select staff_id from staff_func);
尽量不要使用NOT IN子句。使用MINUS 子句都比NOT IN 子句快,虽然使用MINUS子句要进行两次查询:
select staff_name from staff_member where staff_id in (select staff_id from staff_member MINUS select staff_id from staff_func where func_id like ‘81%’);
3、 任何可能的时候,用标准连接或内嵌视图改写子查询。
四、更新、插入、以及删除等DML语句的调整
1、DML语句是指用来执行更新、插入、以及删除等操作类型的语句。这些语句在结构上是很简单的,可调整的余地较小。性能低下的情况有:
插入缓慢并占有过多的I/O资源——这种情况主要是空闲列表(free list)中的数据块的空间过小,仅容的下较少的记录。
更新缓慢——这种情况主要是UPDATE操作扩展了一个VARCHAR2类型的列,而ORACLE被强制将内容迁移到其他数据块时。
删除缓慢——这种情况主要是记录被删除,ORACLE必须将数据块重新放置到空闲列表(free list)时。
因此,对DML进行调整,主要时利用对象存储参数和SQL之间的关系进行调整。
2、 CTFREE存储参数
PCTFREE存储参数告诉ORACLE什么时候应该将数据块从对象的空闲列表中移出。ORACLE的默认参数是PCTFREE=10;也就是说,一旦一个INSERT操作使得数据块的90%被使用,这个数据块就从空闲列表(free list)中移出。
上一篇:有关Oracle数据库中并行处理技术剖析
下一篇:优化调整Oracle 8i数据库



