分类: 数据库开发技术
2009-01-31 00:22:41
我们书写查询语句的时候,Join 参数之前可以是下面三个 { LOOP | MERGE | HASH } JOIN 。 如果不使用,则系统自己分析那种方式快,使用那种方式。
这其实是SQL Server 联结时候使用的三种算法。尽管每种算法都并不是很复杂,但考虑到性能优化,在产品级的优化器实现时往往使用的是改进过的变种算法。譬如SQL Server 支持block nested loops、index nexted loops、sort-merge、hash join以及hash team。我们在这里只对上述三种基本算法的原型做一个简单的介绍。
知识点:
Tables join总是两个两个进行的。所以下面的算法都是两个表的联结。
分别使用这三种 Join 的例子:
create table t1 ( i int not null )
create table t2 ( i int not null )
go
set showplan_text on
go
-- Hash Match(Inner Join, HASH:([ghj_Demo].[dbo].[t2].[i])=([ghj_Demo].[dbo].[t1].[i]))
select * from t1 join t2 on t1.i = t2.i
go
set showplan_text off
go
alter table t1 add primary key ( i )
alter table t2 add primary key ( i )
go
set showplan_text on
go
-- |--Nested Loops(Inner Join, OUTER REFERENCES:([ghj_Demo].[dbo].[t1].[i]))
select * from t1 join t2 on t1.i = t2.i
go
set showplan_text off
go
set showplan_text on
go
-- Merge Join(Inner Join, MERGE:([ghj_Demo].[dbo].[t1].[i])=([ghj_Demo].[dbo].[t2].[i]),
-- RESIDUAL:([ghj_Demo].[dbo].[t2].[i]=[ghj_Demo].[dbo].[t1].[i]))
select * from t1 join t2 on t1.i = t2.i option(merge join)
go
set showplan_text off
go
drop table t1, t2
参考资料:
浅谈查询优化器中的JOIN算法
http://blog.csdn.net/hdy007/archive/2007/02/28/1516467.aspx
Example of merge ,hash and nested join
Inside SQL Server Joins
http://blog.csdn.net/happydreamer/archive/2007/05/16/1611523.aspx