Oracle里面关于排序的优化,只有两种策略:
一种就是尽量将需要排序的数据装载到内存(PGA区域)中,减少磁盘I/O次数。
另一种就是能不排序就不排序。除了order by语句一定排序外,distinct、union等操作会隐含进行排序。Distinct是需要先排序相关字段,然后去掉重复记录。而union和union all的区别是,前者的结果集也需要去掉两个查询语句的重复记录,所以需要排序。后者的结果集市所有记录,包括重复记录,所以不需要排序。
oracle对group by采用的是hashgroup by算法,该算法不保证结果集排序。可以通过内部参数来设置group by算法:
_gby_hash_aggregation_enabled=false或者设置optimizer_features_enabled=9.2.0
适合于大批量数据处理的连接技术只有两种:
1. 排序合并连接(Sort/Merge)技术
两个表先按连接字段进行排序,再将两个表的排序结果进行顺序匹配,将合并结果返回给客户。
2. 哈希连接(HASH)技术
A hash join isexecuted as follows:
Both tables aresplit into as many partitions as required, using a full table scan.
For eachpartition pair, a hash table is built in memory on the smallest partition.
The otherpartition is used to probe the hash table.
两种技术都适合于大表与大表的查询,而且通常情况下,HASH优于Merge,更优于嵌套循环(Nested_Loop)连接技术,尤其是当HASH与Oracle并行处理技术相结合的情况下,将极大地提高系统的整体吞吐量。