日期:2014-05-16  浏览次数:20423 次

品悟性能优化学习笔记二

第6章 如何提高排序、表连接性能
6.1.1关于排序的优化
1.尽量将需要排序的数据装载到内存(PGA区域)中,减少磁盘I/O次数,达到优化的目的。
2.能不排序就不要排序(如果发现sql语句中没必要排序就取消排序)
例如如下关键字: order by ,distinct,union

当然部分排序可以用Oracle的Top—N语句,例如插叙最新入职的前10名员工
    select * from(select * from emp order by hiredate desc
      )where rownum<=10;
6.2 表连接技术和应用
6.2.1表连接3种:
嵌套循环连接 Nested_Loop Join ;排序合并连接Sort_Merge Join以及哈希连接Hash Join

6.2.2排序合并连接(Sort/Merge)技术
该技术也非常易于理解,即两个表先按连接字段进行排序,再将2个表的排序结果进行顺序匹配,将合并结果返回给客户,如下是其示意图:


6.2.3哈希连接技术


总体而言,哈希连接(HASH)技术和排序合并连接技术一样,适合于大表和大表,更准确地讲是大数据量和大数据量的连接应用场景。而且通常情况下,
哈希连接技术性能忧于排序合并连接技术,更优于嵌套循环连接技术。尤其是当哈希连接与oracle并行处理技术相结合的情况下,讲极大地提高系统的整体吞吐量。如下是哈希连接的示意图:


6.3 OLTP应用的表连接优化
OLTP应用的表连接优化的基本思路如下:
1)尽量将限制性最强的表作为驱动表。当然,驱动表上的限制性条件字段上应该有索引,包括主键,唯一索引或者其他索引,复合索引。
2)考虑如下原则:在每次连接操作之后尽量保证返回记录数最少,传递给下一个连接操作。
3)每次连接操作基本采用嵌套循环连接。
4)尽量通过在被驱动表的连接字段上的索引,访问被驱动表。
5)如果被驱动表上还有其他限制条件,可以遵循复合索引创建原则,创建合适的复合索引。
6)全表索引也许是合理的。例如若干小表,代码表的访问。
7)依此类推,顺序完成所有表的连接操作。
8)尽量少写子查询!
6.4如何使用子查询
in和exitsts的使用建议:
先回到前面将的一个原理:Oracle里面只要改技术依然存在,就说明它一定有应用场景,否则就该直接淘汰了。
in和exitsts的使用建议
1)如果限制性强的条件在子查询,则使用in操作。
2)如果限制性强的条件在主查询,则使用exitsts操作。