以下的文章主要描述的是SQL Server 2005合并联接的正确算法,在实际操作中假如遇到两个联接输入而且不小但已在二者,其联接列上排序(例如,假如它们是通过扫描已排序的索引获得的),则合并联接是最快的联接操作。
假如两个联接输入都很大,而且这两个输入的大小差不多,则预先排序的SQL Server 2005合并联接提供的性能与哈希
假如两个联接输入并不小但已在二者联接列上排序(例如,假如它们是通过扫描已排序的索引获得的),则合并联接是最快的联接操作。假如两个联接输入都很大,而且这两个输入的大小差不多,则预先排序的SQL Server 2005合并联接提供的性能与哈希联接相近。
从上次我们分析来看,嵌套循环适合输入和输出都小的情况,那假如输入和输入都比较大情况下,使用合并算法什么情况下更优。
更佳使用:
合并联接本身的速度很快,但假如需要排序操作,选择SQL Server 2005合并联接就会非常费时。然而,假如数据量很大且能够从现有 B 树索引中获得预排序的所需数据,则合并联接通常是最快的可用联接算法。
我们来测试一下,合并连接的更优情况:
测试环境:表:workflowinfo1 约45万条 表workflowbase1 约4.5万条
条件:workflowbase1中列id,creater都建立索引,workflowinfo1中workflowid建立了索引。
假如两个联接输入并不小但已在二者联接列上排序(例如,假如它们是通过扫描已排序的索引获得的),则SQL Server 2005合并联接是最快的联接操作。假如两个联接输入都很大,而且这两个输入的大小差不多,则预先排序的合并联接提供的性能与哈希联接相近。~:(creater=4028814110830a1e01108fe379e60061’的workflowbase1表有1023条数据)
测试语句:
合并算法
select a.* from workflowbase1 a inner merge join dbo.workflowinfo1 b on a.id=b.workflowid and a.creater='4028814110830a1e01108fe379e60061'
hash算法
select a.* from workflowbase1 a inner hash join dbo.workflowinfo1 b on a.id=b.workflowid and a.creater='4028814110830a1e01108fe379e60061'
注意:这两条SQL和上一个嵌套循环的例子有区别,一个 select * 和一个是 select a.*
重启数据库服务,查看成本:
执行结果:
(10468 行受影响)
表'workflowinfo1'。扫描计数1,逻辑读取3527 次,物理读取1 次,预读3528 次,lob 逻辑读取0 次,lob 物理读取0 次,lob 预读0 次。
表'workflowbase1'。扫描计数1,逻辑读取1571 次,物理读取0 次,预读1624 次,lob 逻辑读取0 次,lob 物理读取0 次,lob 预读0 次。
(10468 行受影响)
表'workflowbase1'。扫描计数3,逻辑读取1571 次,物理读取0 次,预读0 次,lob 逻辑读取0 次,lob 物理读取0 次,lob 预读0 次。
表'workflowinfo1'。扫描计数3,逻辑读取3886 次,物理读取0 次,预读0 次,lob 逻辑读取0 次,lob 物理读取0 次,lob 预读0 次。
表'Worktable'。扫描计数0,逻辑读取0 次,物理读取0 次,预读0 次,lob 逻辑读取0 次,lob 物理读取0 次,lob 预读0 次。
这,时,Merge算法比Hash算法少了357次IO。这时发现,成本对比,合并连接要优于hash连接,排序使用了B-tree索引的排序,大表workflowinfo1就没有排序操作。
这里验证了上面的一句话:
假如数据量很大且能够从现有 B 树索引中获得预排序的所需数据,则SQL Server 2005合并联接通常是最快的可用联接算法
假如我们换一下,将select a.*换成select *, 看看成本
这里hash连接是更优的算法
执行结果:
(10468 行受影响)
表'workflowbase1'。扫描计数3,逻辑读取1571 次,物理读取0 次,预读0 次,lob 逻辑读取0 次,lob 物理读取0 次,lob 预读0 次。
表'workflowinfo1'。扫描计数3,逻辑读取9604 次,物理读取0 次,预读0 次,lob 逻辑读取0 次,lob 物理读取0 次,lob 预读0 次。
(10468 行受影响)y
表'Worktable'。扫描计数0,逻辑读取0 次,物理读取0 次,预读0 次,lob 逻辑读取0 次,lob 物理读取0 次,lob 预读0 次。
表'workflowinfo1'。扫描计数1,逻辑读取9604 次,物理读取0 次,预读0 次,lob 逻辑读取0 次,lob 物理读取0 次,lob 预读0 次。
表'workflowbase1'。扫描计数1,逻辑读取1571 次,物理读取0 次,预读0 次,lob 逻辑读取0 次,lob 物理读取0 次,lob 预读0 次。
这里的hash和merge的io次数一样,但merge连接里多了一个排序操作,占到整个成本的60&,的确验证了上面的一句话:
合并联接本身的速度很快,但假如需要排序操作,选择SQL Server 2005合并联接就会非常费时。
两个联接输入并不小但已在二者联接列上排序,则SQL Server 2005合并联接是最快的联接操作。假如没有排序hash连接是更优的操作。
注意:这里的排序指两个输入 *** 必须按相等列进行分别排序。而不是按其他列排序。
北京时间1月13日消息,根据计划,微软将于2015年1月13日正式结束对Windows 7SP1的“主流支持”,而这也标志着“扩展支持”阶段的开始,这个阶段将于2020年1月14日结束。 2013年10月份,微软终止销售独立的Windows 7系统安装包,并要求制造商于2014年10月份停止生...
Intel会在2015年推出Broadwell、Skylake两代14nm处理器,前者可以使用9系芯片组,Skylake升级到了LGA1151插槽,需要搭配新的100系列芯片组,但初期的Skylake-S又不能超倍频,所以今年Q2季度开始会很混杂。Skylake一代会支持DDR4,100系列芯片组升...
最近一些Windows 7用户反馈说,自己在截屏的时候出现黑屏,导致自己截的图黑呼呼一片。这个问题该怎么解决?今天小编就为大家提供一个解决的方法。 步骤 1 在windows xp时代,很多用户都曾被视频截图后的“全黑图片”困扰。对此,在解决本地播放时出现的截图变黑问题,一般有两个方法可以用来解...
当我在虚拟机的linux系统中ping本机的ip发现ping不通,而本机可以ping通虚拟机中的ip。应该是出于安全考虑吧,Windows 7默认在防火墙里禁止了。 1、查看主机ip 打开“开始”程序中的“附件”,找到“命令提示符”打开。输入命令:ipconfig,可以看到本机的ip是192.1...
问题现象,具体如下所示: 故障分析: 一般来说,出现这种情况是因为电脑误删系统文件或者是系统文件被顽固木马破坏。 解决方法: 1、下载360安全卫士,找到里面的急救箱开始急救,然后进行修复,完成后重新启动; 2、下载瑞...
一、打开控制面板,选择“网络和共享中心”; 二、在网络和共享中心中选择“设置新的连接或网络”; 三、选择连接到Internet; 四、选择“仍要设置新的连接”; 五、选择“宽带PPPoE ”; 六、输入对应的宽带帐号及密码,点击连接即可;...