这些天的学习,才发现自己对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 毫秒。

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

05-11 17:30