日期:2014-05-17  浏览次数:20750 次

哈希匹配和嵌套循环
问下大虾们,哈希匹配和嵌套循环的区别在哪里,发现在前者的基础上做表扫描的时候,明显快了很大一截,什么时候会选择前者而不是后者,求真相。。

------解决方案--------------------
非常简单的一个区别就是哈希适用于没有索引、没有预先排序,且数据量巨大的关联。而嵌套循环主要用于小数据量,所有索引的情况下,是非常高效的,但是哈希往往又意味着缺失了适当的索引,到时只能大表关联。对于一个表,特别是大表,不应该没有索引,所以哈希往往也是性能问题的其中一个标志。
------解决方案--------------------
你可以看到你的表都是表扫描或者索引扫描(等同表扫描),也就以为这你的查询其实没用到索引。如果是2008的话应该会有缺失索引的提示的。
------解决方案--------------------
顺便建议引用,不然不知道你回复了。
------解决方案--------------------
究竟哪句是快的?分开来说看不懂呢。
------解决方案--------------------
如果where条件一样且数据量没有太大变化,那么主要是索引影响的。但是写法也会对关联方式有影响。
------解决方案--------------------
FlowLastStep由于是临时数据,没有索引,所以如果数据量很大的话,类似于一个没有任何索引的大表。关联的时候无法找到好的关联方式,所以使用哈希来关联。
------解决方案--------------------
索引查找、扫描其实是指非聚集索引的行为,而非聚集索引的强项在范围查找。这样的话如果范围相对较大,它还是可能会做哈希匹配。你的EmployeeAbnormityInfor表上employeeid有没有索引?
------解决方案--------------------
哈希匹配和嵌套循环是不同的机制,适用于不同的情况,对数据库而言,选择何种连接方式是基于开销的,数据库会根据统计信息选择开销相对较小的连接方式,除非你用了提示。
如果一定要找规律,大概 排序、索引查找后面接的多是嵌套循环
位图、表扫描、并行度后面接的多是哈希匹配
------解决方案--------------------
主键默认会有聚集索引,如果没有,那这么它需要借助rid来找数据,称为书签查找,是其中一种最低效的查询,所以主键默认会有聚集索引。