- 1、本文档共10页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
写有效率的SQL查询(VI)
我们先看NestedLoop和MergeJoin的算法(以下为引用,见RicCC的《通往性能优化的天堂-地狱 JOIN方法说明》):==================================NestedLoop:???foreach rowA in tableA where tableA.col2=???? {??? search rowsB from tableB where tableB.col1=rowA.col1 and tableB.col2=? ;??? if(rowsB.Count=0)??? ??? discard rowA ;??? else??? ??? output rowA and rowsB ;??? }MergeJoin:两个表都按照关联字段排序好之后,merge join操作从每个表取一条记录开始匹配,如果符合关联条件,则放入结果集中;否则,将关联字段值较小的记录抛弃,从这条记录对应的表中取下一条记录继续进行匹配,直到整个循环结束。==================================
?
我们通过最简单的情况来计算NestedLoop和MergeJoin的消耗:两张表A、B,分别有m、n行数据(m n),占用基础表物理存储空间分别为a、b页,聚集索引树非叶节点都是两层(一层根节点,一层中间级节点),A、B的聚集索引建在A.col1、B.col1上。一条查询语句:select A.col1, B.col2 from A inner join B where A.col1 = B.col1。
?
执行NestedLoop操作:A作为outer input,B作为inner input时:A带来的IO为a;每次通过clustered index seek执行内部循环,花费3(一个根节点、一个中间集结点、一个叶节点。当然也可能直接从根节点就拿到要的数据,我们只考虑最坏的情况),这样执行整个嵌套循环过程消耗IO为a + 3*m。如果B作为inner input,A作为outer input分析类似。
执行MergeJoin:MergeJoin要把A、B两张表做个Scan,然后进行Merge操作。所以A、B分别带来IO为a + b就是总的逻辑IO开销。
?
从上述分析来看,若a + 3*m a + b,即3*m b,那么NestedLoop性能是极佳的。当然,我们比较A表的行和B表所占数据页大小看上去有点夸张,但是量化分析确实如此。在这里,我们没有计算NestedLoop和MergeJoin本身的cpu计算开销,特别是后者,这部分并不能完全忽略,但是也来得有限。
?
OK,现在我们试图执行实际的语句验证我们的观点,看看能发现什么。
我有两张表,一张表charge,聚集索引在charge_no上,它是个int identity(1,1),共10万行,数据页582张,聚集索引非叶节点2层。一张表A,聚集索引在col1上(唯一),共999行,数据页2张,聚集索引两层。min(A.col1) = min(charge.charge_no)、Max(A.col1) max(charge.charge_no)。
我们在set statistics io on和set statistics time on之后,执行语句:
select A.col1, charge.member_no from A inner join charge
on A.col1 = charge.charge_no
option(loop join) -–执行NestedLoop
go
select A.col1, charge.member_no from A inner join charge
on A.col1 = charge.charge_no
option(merge join)--执行MergeJoin。
结果集都是999行,而且我们看到消息窗口中输出为:?
(图1)
从上图中我们注意到几点比较和最初分析不同的地方:
1.????? Nested Loop时,表A的逻辑读是4,而不是预计中的表A数据页大小2;charge逻辑读2096,而不是预计中的3×999。
2.????? Merge Join时,表Charge的逻辑读只有8。
对1来说,表A的逻辑读是4是因为clustered index scan需要从聚集索引树根节点开始去找最开始的那张数据页,表A的聚集索引树深度为2,所以多了两个非页节点的IO。不是3×999是因为有些记录(设为n)直接从根节点就能找到,也就是说有些是2×n + (999-n)* 3
对2来说,MergeJo
您可能关注的文档
- 内蒙古自治区烟草公司赤峰市公司滥用市场支配地位行为的处罚决定.doc
- 内蒙古自治区科普资源开发与共享工程实施工作方案.doc
- 内蒙古草原文化旅游空间略论.doc
- 内蒙古褐煤固体热载体法快速热解技术示范工程项目.doc
- 内蒙古阿拉善地区生态困局与对策.doc
- 内蒙古通辽公选考试基础知识之国情国力国土与资源.doc
- 内蒙古通辽公选考试基础知识之管理现代领导决策体制.doc
- 内蒙竞赛理论考试试卷.doc
- 内衣生产工艺.doc
- 内酰胺类抗菌药物的比较.doc
- 上海海洋大学《海洋环境分析技术》课件-21化学发光分析法.pdf
- 上海海洋大学《海洋环境分析技术》课件-20分子荧光分析法.pdf
- 上海海洋大学《海洋环境分析技术》课件-22色谱分离过程.pdf
- 上海海洋大学《海洋环境分析技术》课件-25气相色谱仪与固定液.pdf
- 上海海洋大学《海洋环境分析技术》课件-24色谱定性定量方法.pdf
- 上海海洋大学《海洋环境分析技术》课件-26气相色谱检测器.pdf
- 上海海洋大学《海洋环境分析技术》课件-29液相色谱固定相与流动相.pdf
- 上海海洋大学《海洋环境分析技术》课件-27气相色谱分离条件的选择.pdf
- 上海海洋大学《海洋环境分析技术》课件-28液相色谱仪器与类型.pdf
- 上海海洋大学《海洋环境分析技术》课件-3 原子光谱和分析光谱.pdf
文档评论(0)