以下的文章主要描述的是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连接是更优的操作。
注意:这里的排序指两个输入 *** 必须按相等列进行分别排序。而不是按其他列排序。
扫描二维码推送至手机访问。
版权声明:本文由2345好导航站长资讯发布,如需转载请注明出处。
有些使用本本的朋友可能会发现,右下角通知栏区域会无法显示电源按钮,导致在插上电源或者是使用电池的时候都无法进行区分。造成这种情况大部分都是因为使用了第三方修改过的系统版本或者对于系统优化过度,所以今天就来解决这个问题。 第一步:在开始菜单的搜索窗口输入“gpedit.msc”,进入组策略编辑器,依...
Intel会在2015年推出Broadwell、Skylake两代14nm处理器,前者可以使用9系芯片组,Skylake升级到了LGA1151插槽,需要搭配新的100系列芯片组,但初期的Skylake-S又不能超倍频,所以今年Q2季度开始会很混杂。Skylake一代会支持DDR4,100系列芯片组升...
故障现象: Windows 7酷狗软件无声音,系统声音正常。 原因分析: 1. 查看酷狗软件设置 2. 查看系统设置 解决方案: 1. Windows 7操作方法 如图:查看是否处于禁音状态 Windows 7系统声音正常酷狗音乐无声音 2. 查看设置音频输出是否...
一些用户的Windows 7系统开机后出现黑屏,代码为 Windows无法启动: WindowsSystem32ConfigSystem”。这个问题该如何修复呢?现在小编就给大家分析一下吧。 其实这个代码的意思是引导文件丢失了,引导文件(NTLDR)一般存放于C盘根目录下,是一个具有隐藏和只读属性...
最近一些Windows 7用户反馈说,自己在截屏的时候出现黑屏,导致自己截的图黑呼呼一片。这个问题该怎么解决?今天小编就为大家提供一个解决的方法。 步骤 1 在windows xp时代,很多用户都曾被视频截图后的“全黑图片”困扰。对此,在解决本地播放时出现的截图变黑问题,一般有两个方法可以用来解...
问:我在Windows 7 Ultimate X64下播放电影视频时,不管什么格式都会蓝屏,错误代码“0x00000124”。换解码器、播放器不行,换驱动、内存也不管用。在不同的电脑上也试过,仍然蓝屏。请问是哪里的问题,如何解决 答:64位 Windows 7直接使用PotPlayer x64就...