SQL Server Join 方式

 SQL Server Join 方式

Author:zfive5(zidong)
Email:zfive5@163.com

引子

参加查询计划培训后,发现数据库绝对不是“增删改查”那么简单,即使来从业10几年的专家,也不敢说自己数据库多么精通。通过大家交流后发现即使selectcount(*) 都会产生不一样的结果。

 

培训的时候讲到了很多执行计划的图标,其中就三个图标的含义,在不同的文章解释一大堆话,而且看到有些似懂非懂的,直至看到《看懂SqlServer查询计划》中的伪码才恍然大悟。

 

URL:http://www.cnblogs.com/fish-li/archive/2011/06/06/2073626.html#_label1

 

 

所以想用伪码表达一下其他两个方式。

正文

哈希匹配:

前提:无

 

 

 

图标画的也很到位

 

 

foreach(row  r1  in  outer table)

{

    HashTable (Hash(r1),r1);

}

 

foreach(row  r2  in  innertable)

{

If(HashTable.contians(Hash(r2)))

  output(HashTable (Hash(r2), r2)

}

 

合并连接:

 

前提:两个连接字段是排序的

 

 

 

图标画的也很到位

 

Int  i=0;

Int  j=0;

for( ; i< outer Table.count;)

{

r1=outer table[i];

for(;j< inner Table.count 😉

{

        if(r1= r2 )  

{

output(r1, r2);

j++;

}

 

        if(r1>r2)   

{

j++;

  continue;

}

 

        if(r1<r2)

        {

          I++;

          break;

        }

    }

}

 

 

 

 

嵌套循环:

 

 

 

图标画的也很到位

 

 

foreach(row  r1  in  outer table)

{

foreach(row  r2  in  inner table)

{

        if( r1, r2 符合匹配条件 )

            output(r1, r2);

    }

}

 

嵌套循环伪码来自上面提到的文章

 

下图摘自《SqlServer2008查询性能优化》:

 

标签