多表连接的三种方式详解 hash join、merge join、 nested loop
项目中的SQL执行效率太低,就用执行计划看一下执行SQL,看不懂,百度一下,纪录下来:
大多数人从来没有听说过这些连接类型,因为它们不是逻辑连接也很少被用于代码中。那么它们什么时候会被用到呢?答案是要依情况而定。这就意味着要依赖于记录集和索引。查询优化器总是智能的选择最优的物理连接类型具体适用哪种类型的连接取决于
- 取决于表大小。
- 取决于连接列是否有索引。
- 取决于连接列是否排序。
hash join:Hash join在两个表的数据量差别很大的时候,优化器使用两个表中较小的表(或数据源)利用连接键在内存中建立散列表,然后扫描较大的表并探测散列表,找出与散列表匹配的行。这种方式适用于较小的表完全可以放于内存中的情况。
merge join:通常情况下散列连接的效果都比排序合并连接要好,然而如果行源已经被排过序,在执行排序合并连接时不需要再排序了,这时排序合并连接的性能会优于散列连接。Sort Merge join 用在没有索引,并且数据已经排序的情况。将关联表的关联列各自做排序,然后从各自的排序表中抽取数据,到另一个排序表中做匹配,因为merge join需要做更多的排序,所以消耗的资源更多。 通常来讲,能够使用merge join的地方,hash join都可以发挥更好的性能。
nested loop: 循环从一张表中读取数据(驱动表outer table),然后访问另一张表(被查找表 inner table,通常有索引)。驱动表中的每一行与inner表中的相应记录JOIN。类似一个嵌套的循环。适用于驱动表的记录集比较小(<10000)而且inner表需要有有效的访问方法(Index),并且索引选择性较好的时候。JOIN的顺序很重要,驱动表的记录集一定要小,返回结果集的响应时间是最快的。Nested loop一般用在连接的表中有索引,并且索引选择性较好的时候.