SQL server 内部实现了三种类型的内连接运算大多数人从来没有听说过这些连接类型,因为它们不是逻辑连接也很少被用于代码中那么它们什么时候会被用到呢?答案是要依情況而定这就意味着要依赖于记录集和索引。查询优化器总是智能的选择最优的物理连接类型我们知道SQL优化器创建一个计划开销是基于查询开销的,并依据此来选择最佳连接类型
SQLServer在内部为查询优化器对连接类型的选择实现了一些算法,让我们来看下面的一些练习示例朂后来做总结。
首先我给出一些基本的思想连接是怎样工作什么时候工作,优化器又是怎样决定使用哪种类型的内连接
测试1:大表,沒有索引
现在来创建一个聚族索引:
如果连接中的任何一个表有索引那么将采用Hash Join我并没有贴上所有结果截图,如果你感兴趣你可以删除任何一个表中的索引来做测试
测试2:中表,没有索引
首先还是创建一个聚族索引:
对于中等大小的表如果连接中的任何一个表有索引,那么将采用Merge Join
测试3:小表,没有索引
对于小表如果任何一个表中有索引,那么将采用nested loop joinLoop Join
同样也可以从另一个方向来做比较,比如大表對比中表对比小表
在这种情况下若所有或部分表都有索引则采用nested loop joinLoop Join,如果都没有则使用HashJoin
当然你也可以强制优化器使用任何一种连接类型,但这并不是一种值得推荐的做法查询优化器很智能,能够动态的选择最优的一个这里我只是显示调用了MergeJoin,所以优化器使用MergeJoin替代本来應使用HashJoin (测试1没有索引)
表1 测试唯一聚族索引
? 如果两个表都没有索引则查询优化器内部会选择Hash Join
这个测试是在没有使用唯一聚族索引下完成,可以知道如果创建索引的时候没有使用UNIQUE关键字则无法保证SQLServer会知道这是UNIQUE数据所以它默认会创建4字节整数来作为唯一标识符。
Merge Join是为那些在連接列上有索引的表索引可以是聚族索引或者非聚族索引。Merge是这种情况最好的Join类型需要两个表都有索引,所以它已经排好序并更容易匹配和返回数据
Hash Join是为那些没有索引或者其中任一个有索引的大表。对于这种情况它是最好的Join类型为什么呢?因为它能够很好的工作于沒有索引的大表和并行查询的环境中并提供最好的性能。大多数人都说它是Join的重型升降机
nested loop joinLoop Join是为那些有索引的小表或其中人一个有索引嘚大表。它对那些小表连接需要循环执行从一个到另一个表的按行比较的情况下工作最好的。
我希望你现在能理解查询优化器是如何选擇最优的查询类型
}
第一部分:听力(共两节满分30汾)
做题时,先将答案划在试卷上录音内容结束后,你将有两分钟的时间将试卷上的答案转涂到答题卡上。
第一节(共5小题;每小题1.5分满汾7.5分)
听下面五段对话。每段对话后有一个小题从题中所给的A、B、C三个选项中选出最佳选项。听完每段对话后你都有10秒钟的时间来回答有关小题和阅读下一小题。每段对话仅读一遍
第二节(共15小题;每小题1.5分,满分22.5分)
听下面5段对话或独白每段对话或独白后有几个小題,从题中所给的A、B、C三个选项中选出最佳选项并标在试卷的相应位置。听每段对话或独白前你将有时间阅读各个小题,每小题5秒钟;听完后各小题将给出5秒钟的作答时间。每段对话或独白读两遍
听第6段材料,回答第6、7题
}