mssql sqlserver 强制使用联接提示指定联接方式


摘要:
在sqlserver sql脚本编写中,我们可以使用option子句指定表之间的联接方式,如下所示:
实验环境:sql server 2008 R2



1.方式1:为每个联接指定单独的联接方式

我们可以在from子句后使用 merge join、hash join、loop join 提示符为单独的联接指定联接方式,如下所示:

---强制使用 merge join   
SELECT a.a,a.b,a.c,b.d,b.e  from
  table1 a inner merge join table2 b 
 on a.keyId = b.keyId  

---强制使用 hash join   
SELECT a.a,a.b,a.c,b.d,b.e  from
  table1 a inner hash join table2 b 
 on a.keyId = b.keyId  


---强制使用 loop join   
SELECT a.a,a.b,a.c,b.d,b.e  from
  table1 a inner loop join table2 b 
 on a.keyId = b.keyId  
 


在多表联接中,如果我们采用option强制指定联接方式,会改变联接的顺序,
在sqlserver中,如果系统预估的统计计划都在合理的范围中,通常sql引擎会自动生成最优的执行计划。


2.方式2:为全部联接指定统一的联接方式

我们可以使用在查询语句最后使用option修饰符,使所有联接都使用相同的联接方式,如下所示:

 --为所有的表指定hash联接方式
  SELECT *  from
  table1 a , table2 b ,table3 c 
 where a.keyId =b.keyId  and b.keyId = c.keyId 
 option (hash join)