各种连接方法的简单描述如下:
·SORT-MERGE(排序接合)
--根据连接键排序表,然后将它们接合在一起;
--排序是非常昂贵的;
其使用的优化器提示主要为USE_MERGE;NO_USE_MERGE。
• NESTED LOOPS
--从一个表提取行,然后在另一个表中查找相应的行;
--对于少量的行通常是最好的;
其使用的优化器提示主要为USE_NL;NO_USE_NL;USE_NL_WITH_INDEX。
• HASH JOIN
--为小的行源在内存中建立哈希表;
--哈希大的行源;
--查找内存哈希表匹配;
--仅在CBO中才能使用哈希连接。
其使用的优化器提示主要为USE_HASH;NO_USE_HASH。
[@more@]Oracle连接方法的简单讲解
各种连接方法的简单描述如下:
·SORT-MERGE(排序接合)
--根据连接键排序表,然后将它们接合在一起;
--排序是非常昂贵的;
其使用的优化器提示主要为USE_MERGE;NO_USE_MERGE。
• NESTED LOOPS
--从一个表提取行,然后在另一个表中查找相应的行;
--对于少量的行通常是最好的;
其使用的优化器提示主要为USE_NL;NO_USE_NL;USE_NL_WITH_INDEX。
• HASH JOIN
--为小的行源在内存中建立哈希表;
--哈希大的行源;
--查找内存哈希表匹配;
--仅在CBO中才能使用哈希连接。
其使用的优化器提示主要为USE_HASH;NO_USE_HASH。
所有的连接操作都在两个行源上发生,通常都是表,也可能是计划中先前的操作产生的行。
提示:两表连接通常涉及到主外键问题,很少说在两张没有关系的表之间进行连接(八成是设计出了问题)。如果在连接键之间建立了恰当的索引,收集了比较新的统计(Oracle 10g提供了自动收集统计功能,在9i中可以通过建立一个JOB完成自动收集),优化器在大部分情况下会选择较好的连接方法和选择路径,可以说已经完成了SQL优化的主要部分。因为在OLTP环境下SQL一般不会太复杂,解析不会占用太多的时间,在OLTP环境下基本上已经足够了;而DSS下显示指出各种连接方法以及提示等是因为如果一个SQL连接了很多表,Oracle为了寻找较好的执行计划需要花费大量时间进行比较。
接合连接
排序接合连接,通常在接合连接前有两次排序操作,如果行是通过索引提取的,则可以避免排序。
嵌套循环连接
嵌套循环操作的第一个操作是从外部表中提取一行,Oracle服务器在第二个表中查找相应的行,外部表行源的数据应该尽可能的少。提取第二个行源的方法通常是使用索引扫描(即内部表要严格依赖于驱动表,否则就成了笛卡尔连接)。如果这些条件满足,嵌套循环会非常有效。
哈希连接
通常最小的行源太大以至于不适合在内存中,并且必须分区到不同的哈希表中,Oracle通常为哈希表建立一个位图并且快速查找行源以确定行是否在内存中,其通过避免访问磁盘(行不在磁盘上)提高性能。
哈希连接只要设置得hash_area_size足够大,通常非常有效,默认为sort_area_size * 2,是PGA的一部分。如果使用了9i+的pga_aggregate_target,则这些参数设置会被忽略。
通常使用提示的主要是为了执行的稳定性,执行计划不稳定的主要原因是收集的统计不正确,也就是优化器使用了过期的统计才会导致在通常情况下出现使用提示更好的情况。因此推荐对于生产系统,根据表的活动情况,按照一定的间隔使用job对各类表进行收集统计。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10508379/viewspace-985330/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/10508379/viewspace-985330/