Oracle SQL的优化(4)

发表于:2007-05-26来源:作者:点击数: 标签:
处理数据集的操作: 一旦数据从表或索引返回,就可以对其进行处理了,可以对记录分组,分类,计数,锁定或者将查询的结果 与其它查询的结果进行合并(union、minus、intersect)。 ·大多数处理记录集的操作在整个操作完成前不会向用户返回数据! ·索引扫描操
处理数据集的操作:
    一旦数据从表或索引返回,就可以对其进行处理了,可以对记录分组,分类,计数,锁定或者将查询的结果
与其它查询的结果进行合并(union、minus、intersect)。
    ·大多数处理记录集的操作在整个操作完成前不会向用户返回数据!
    ·索引扫描操作和表访问操作在找到记录后立刻将它返回给用户!
    ·在集合操作中,用户必须等待操作处理完成所有的行,才将结果集返回给用户!
1、行的分类
   有三个Oracle的内部操作在不必对行进行分组的情况下就可以对它们进行分类操作了:
   (1)、Sort Order by 操作
   (2)、Distinct操作(Sort Unique操作)
   (3)、Sort Join操作,它总是作为merge join 操作的一部分是用,它从不独自使用

2、行的分组
   Oracle有两个内部操作在将类似的记录组织在一起的过程中对行进行分类:
   (1)、Sort aggregate操作
   (2)、Sort group by操作
·它们与分组函数结合在一起使用,例如:
 select max(salary) from emp
  为了完成这个查询,优化器将执行两个独立的操作:
  1)、Table aclearcase/" target="_blank" >ccess full操作从表中选择salary值;
  2)、利用Sort aggregate操作对行进行分析,该操作将向用户返回最大的salary值,
  这个查询在读出所有记录且完成Sort aggregate操作之前,将不返回最大的salary值。
·使用group by子句的查询将使用Sort group by操作。
  例如:select deptno,count(salary) from emp group by deptno;
  为了完成这个查询Oracle将执行一个Table access full操作,此查询没有限定条件,故不会使用索引,
因为使用了group by子句,所以,Table access full操作返回的行将由Sort group by操作来处理,一旦
所有的行都分成组,且每个组的计数都已计算出来,则将结果返回给用户。

注意:如果应用程序不要求在给出查询的输出前对所有的行进行分类,则可以考虑使用fist_rows提示,该
      提示会告诉优化器尽量不使用进行集合操作的执行路径!

原文转自:http://www.ltesting.net