嵌套循环
适用:连接大小表,小表是外部的,大表是内部的,大表必须使用索引,索引有很好的选择性。
当连接的数据子集很小时,嵌套循环连接是更好的选择。嵌套循环意味着扫描一个表。每读一条记录,就会根据索引在另一个表中查找。如果没有索引,就不会出现嵌套循环。一般在嵌套循环中,被驱动表满足条件的结果集并不大,而且被驱动表的连接字段要有索引,所以采用嵌套循环。如果驱动表返回的记录太多,就不适合嵌套循环。如果连接字段没有索引,则适合采用哈希连接,因为不需要索引。
有序提示符可用于更改默认的CBO驱动程序表,USE_NL(table_name1 table_name2)提示符可用于强制使用嵌套循环。
散列连接
适用:大表与大表、小表与最大表的连接。
散列连接是CBO连接大型数据集常用方式。优化器扫描小表(或数据源),利用连接键在内存中构建哈希表(即根据连接字段计算哈希值),然后扫描大表,每读取一条记录检测一次哈希表,找出与哈希表匹配的行。当所有的小表都可以放入内存时,它的开销接近扫描整个表中两个表的开销之和。如果表太大,内存放不下,优化器会把它分成几个不同的分区,内存放不下的分区会被写入磁盘的临时段。这时候应该有一个更大的临时段来尽可能的提高I/O的性能。临时段中的所有分区都需要换到内存中进行哈希连接。此时的代价接近扫描一个小表的代价+分区数*扫描一个大表的代价之和。
至于两个表都被分区,好处是可以使用并行查询,即多个进程同时加入不同的分区,然后合并。但是很复杂。
使用hash join时,HASH_AREA_SIZE的初始化参数必须足够大。如果是9i,oracle建议使用SQL workspace自动管理,将WORKAREA_SIZE_POLICY设置为auto,然后调整PGA_AGGREGATE_TARGET。
use _ hash(table _ name 1 table _ name 2)提示强制哈希联接。
排序合并联接
适用:表的内容是排序的,但是大部分都被hash join代替。
sort merge join的操作通常分为三步:表访问满;对于每个连接的表;对表访问的结果进行完全排序;Merge join合并排序结果。排序合并连接的性能开销几乎总是在前两步。一般9i在没有索引的情况下很少出现。由于其排序成本较高,所以大多被hash join替代。
通常情况下,哈希连接的效果要比排序合并连接的效果好。但是如果行源已经排序,那么在执行排序合并连接时就不需要排序了,这样排序合并连接的性能就会比哈希连接好。如果全表扫描优于索引范围扫描,然后通过rowid访问表,排序合并连接将比嵌套循环执行得更好。
use _ merge(table _ name 1 table _ name 2)提示强制使用排序合并联接。
关键词:甲骨文
优侠库网站每天提供最新最热门的安卓手机软件、游戏下载、分享热门手游资讯攻略教程、手机软件教程步骤,专注安卓手机游戏软件下载。本文链接:http://www.123down.cn/gonglue/227351.html