Oracle表三连接模式使用介绍(SQL优化)
1。嵌套循环嵌套循环连接是连接数据集较小子集的较好选择,嵌套循环是扫描一个表,每次读取一个记录,并根据索引在另一个表中搜索它。如果没有索引,它不会被嵌套循环。一般来说,在嵌套循环,司机表满足条件的结果集,并对驱动表的连接字段的索引,使nstedloop服用。如果驱动表中返回的记录太多,对于嵌套循环,它是不适合的。如果连接字段不是索引,适合走哈希连接因为指数是不需要的。
命令提示符可以用来改变CBO默认驱动程序表和使用use_nl(table_name1 table_name2)提示强制使用嵌套循环。
要点如下:
1)嵌套循环连接是连通数据集较小子集的较好选择。
2)使用use_nl(table_name1 table_name2)而迫使国会预算办公室执行嵌套循环连接
3)嵌套循环通常用于在连接表中有索引,而当索引更好时。
4)网络的顺序是非常重要的,设置的驱动表记录必须小,并返回结果集的响应时间是最快的。
5)嵌套循环的工作方式是从一个表中读取数据,并访问另一个表(通常是索引)以匹配。嵌套循环适用于相关表相对较小的场合,其效率更高。
2。哈希连接
哈希连接是CBO是一个大的数据集连接的一种常用方法,优化扫描小表(数据源),使用连接密钥(即根据连接领域计算哈希值),建立内存中的哈希表,然后扫描大表,每次读取一个记录探测哈希表一次,发现它与哈希表匹配的行。
当一个小桌子可以完全存储在内存中,成本接近一个完整的表成本两表扫描的总和。如果表很大,不能完全放入内存时,优化器将它分为几个不同的分区,它不能放进记忆的一部分写分区的磁盘临时段。此时,必须有一个更大的临时区段来尽可能地提高I/O性能,临时段中的分区都需要转换成内存进行哈希连接,此时的成本接近于全表扫描小表+分区数*全表扫描大表的成本。
至于要划分的两个表,其优点是可以使用并行查询,也就是说,多个进程同时加入不同的分区,然后合并,但是很复杂。
当使用哈希连接,对hash_area_size初始化参数必须足够大。如果是9i,Oracle建议使用SQL工作区自动管理,设置workarea_size_policy汽车,然后调整pga_aggregate_target。
哈希连接在以下条件下可能有优势:
1)两个大表之间的连接。
2)大桌子与小桌子之间的联系。
要点如下:
1)哈希连接是CBO作为大数据集连接的常用方式。
2)你也可以迫使哈希连接use_hash(table_name1 table_name2)提示
3)当两个表的数据量与散列连接有很大不同时。
(4)哈希连接的工作方式是在表(通常是较小的表)上进行散列运算,并将其存储在哈希表中,从另一个表中提取记录,进行哈希运算,在哈希表中找到相应的值,进行匹配。
命令提示符可以用来改变CBO默认驱动程序表和使用use_hash(table_name1 table_name2)提示强制使用加入哈希。
三.排序合并连接
a)为连接的每个表都进行表访问;
B)表访问完整的结果被排序;
c)排序结果与合并联接合并。
排序合并连接几乎所有的性能开销中的前两个步骤。一般来说,在一个指数的情况下,9i已经很少看到由于其高排名的成本,其中大部分是由哈希连接。
通常,哈希连接的效果比排序合并连接的效果更好。但是,如果在排序合并合并时,不需要重新排列行源,那么排序合并连接的性能要优于排序合并连接。
排序合并连接将比嵌套循环时,全表扫描的索引范围扫描后,最好是通过rowid访问表。
要点如下:
1)使用use_merge(table_name1 table_name2)强制使用排序合并连接。
2)在没有索引的情况下使用排序合并连接,并对数据进行排序。
3)连接步骤:对两个表进行排序并合并两个表。
4)通常只有在下列情况发生时才使用此连接模式:
一)RBO模式
B)非等价关联(>,=,)
C)bhash_join_enabled = false
d)数据源已排序
e)合并联接首先对相关表的相关列进行排序,然后从每个排序表中提取数据并将它们与另一个排序表进行匹配,因为合并联接需要更多的排序,因此它消耗更多的资源。
f)喜欢,不喜欢
一般情况下,可以使用合并连接,哈希连接可以执行更好的性能。
使用use_merge(table_name1 table_name2)提示强制使用排序合并连接。