SQL Server2008 inner join多种方式的实践

     这些天的学习,才发现自己对SQL原来是如此的不了解。之前一直以为自己轻松应对各种复杂的SQL查询,但是一旦提到效率上,可能就比较傻眼了,有时候也会埋怨客户的服务器不好使。

     至于Inner Join的三种方式:loop,merge, hash,园子里面有很多文章,话说看多遍不如自己实际操作一遍。今天也来操作一番试试。说明:T(4)表中约有4.6万行数据,T(1)表中约有4.1万行数据

     第一种:merge

declare @begin datetime
Declare @end datetime
set @begin = GETDATE()
set statistics io on Select * From dbo.[T(4)] inner merge join dbo.[T(1)] On dbo.[T(4)].keyword0 = dbo.[T(1)].keyword0
set statistics io off set @end = GETDATE() print datediff(millisecond,@begin,@end)

  第二种:hash

   

Declare @begin datetime
Declare @end datetime
set @begin = GETDATE()
set statistics io on Select * From dbo.[T(4)] inner hash join dbo.[T(1)] On dbo.[T(4)].keyword0 = dbo.[T(1)].keyword0
set statistics io off set @end = GETDATE() print datediff(millisecond,@begin,@end)

  两种SQL执行的结果分别显示:

(239657 行受影响)
表 'T(4)'。扫描计数 10,逻辑读取 3236 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 ''T(1)'。扫描计数 10,逻辑读取 3064 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'Worktable'。扫描计数 12,逻辑读取 430 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
耗时:22006


   (239657 行受影响)
  表 ''T(4)'。扫描计数 10,逻辑读取 3236 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
  表 ''T(1)'。扫描计数 10,逻辑读取 3064 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
  表 'Worktable'。扫描计数 0,逻辑读取 0 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
耗时:17026

   从上可以看出,Merge比Hash多了一步操作,就是对Worktable的操作,多出的时间耗时应该就是在此处所消耗的。

   CPU耗时分别如下:

   (239657 行受影响)

  SQL Server 执行时间:
   CPU 时间 = 12763 毫秒,占用时间 = 24520 毫秒。

 

  (239657 行受影响)

 SQL Server 执行时间:
   CPU 时间 = 11702 毫秒,占用时间 = 17587 毫秒。
 

   本来还想查看下内存开销,结果不知道有啥好的方法可以查看内存开销。今天就先暂时到这,后续继续。

 

 

posted @ 2015-10-21 15:09  中级菜鸟  阅读(880)  评论(0编辑  收藏  举报