[转]SQL Server 2000执行计划成本(3/5) 哈希连接
哈希和合并连接都是分开处理内部源和外部源的。连接条件不能用作搜索参数。当没有为表或存在的不合适的索引明确指定搜索参数时,就要对那个表进行扫描。有可能哈希和合并连接有书签查找操作,但也未必,除非强制指定连接类型。
下面的查询明确声明一个哈希连接。连接操作里的每一个表指定了搜索条件,并且两个表都有聚集索引或覆盖索引。
SELECT m.ID, n.Value
FROM M2C m INNER HASH JOIN M2D n ON n.ID = m.ID
WHERE m.GroupID = @Group1 AND n.GroupID = @Group2
图2-19里的执行计划由每个源上的索引搜索操作加上哈希连接共计3部分组成。哈希连接的成本细节在图2-20里显示。
哈希和合并连接对于内部源和外部源的成本结构按照前面描述的索引搜索或表扫描操作的规则。外部源和内部源操作都在所有行参与的单个执行里处理,不象循环连接的内部源是根据外部源的每行执行一次。哈希连接组成的操作的成本结构大致按照下面的规则:
CPU Cost = ~0.017770 + ~0.00001881 per row, 1-to-1 join
+ 0.00000523 to 0.000000531 per additional row in IS
第一行适合于一对一的连接。第二行适合于外部源的每一行连接到内部源多行的情形。每行成本结构也适合由少量行的表作为外部源的情形。上面的哈希连接的总成本为以下几个的和:外部源索引搜索,内部源索引搜索和哈希连接。
合并连接
合并连接的细节在SQLServer文档和其他地方有过讨论。有两种类型的合并连接:一对多(包括一对一)和多对多合并连接。两种类型的合并连接都要求每个表里的行排序。一对多连接是更简单更有效的操作。一对多合并连接另外的要求关键是外部源的行必须在连接列上是唯一的。外部源的每一行可以连接内部源的任意多行,但内部源的每一行不能连接外部源的多行。多对多合并连接没有要求这个条件但它是更复杂的操作。
下面的查询特别指定一个合并连接,它将强迫连接排序。外部源(M2C)在列GroupID和ID上有覆盖索引。外部源的连接列是ID字段,它是主键,所以适合一对多的合并连接条件。两个表都明确指定了一个搜索参数允许外部源和内部源上执行索引搜索操作代替表扫描。两个表都有聚集索引或覆盖索引,所以不要求书签查找操作。
SELECT m.ID, n.Value
FROM M2C m INNER MERGE JOIN M2D n ON n.ID = m.ID
WHERE m.GroupID = @Group1 AND n.GroupID = @Group2
合并连接执行计划显示在图2-21里。图2-22显示了合并连接细节。注意最下面的参数(argument)条目是MERGE。该合并连接的成本结构有三部分操作组成:两个索引搜索操作(一个为外部源另一个为内部源)和合并连接操作。索引搜索操作的成本结构已经了解了。
合并连接的成本结构基本上如下:
CPU Cost = ~0.0056046 + ~0.00000446 per row, one-to-one
成本规则对于某些个案有少量的不同。对于一对多连接,内部源每增加一行的成本是:
CPU Cost 0.000002370 per additional inner source row
对于所以类型的连接,成本结构适合外部源表提供少量行而内部源表提供更多的行的情形。