- 1、本文档共5页,可阅读全部内容。
- 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查询(II)
上回我们说到评估一条语句执行效率主要看逻辑IO(啥是逻辑IO,啥是物理IO见联机文档),这次我们继续。
我们先说说,返回多行结果时,为什么SQLServer有时会选择index seek,有时会选择index scan。
以nonclustered index为例说明。
像所有的索引B树一样,非聚集索引树也包括完全由索引数据组成的根节点和中间级节点;但是和聚集索引树不同的是,聚集索引树叶节点包含的是基础表的数据页(我们常说,表的物理存储顺序和聚集索引相同,就是这个原因),非聚集索引树叶节点是索引页。SQLServer通过非聚集索引查找数据时,会通过这个非聚集索引键值去搜索聚集索引,进而检索基础表数据行。
假设有这样一张表,非聚集索引树深度为2,一层根节点(1个索引页),一层叶节点(4个索引页)。聚集索引树深度为3,一层根节点(1个索引页),一层中间级节点(2个索引页),一层叶节点(250页,也就是基础表物理存储页)表的数据假设1w行。注:所有数据均为假设,只为说明原理。
我们首先,再强调一遍,SQLServer获取数据,总是以页为单位,就算是只读取一行也会获取整张页(见《写有效率的SQL查询(I)》)
现在有一条简单查询(如:select * from tb where col2 = 99,col2是tb表中的非聚集索引),假设会返回100行。
Ok,我们来分析如果以Index seek来查找这100行会有多少IO。index seek每次都从索引树根节点开始查找,找到中间级节点(99对应的索引行),然后从该节点行开始连续遍历所有col2为99的索引行。在遍历这些行时,每拿到一条,都会通过该条索引行中聚集索引键值去聚集索引树中index seek,然后从数据页中获取数据。在最坏的情况下,col2为99对应的索引行跨越了全部4个叶级非聚集索引页(当然,这没啥可能性,举例而已,切勿深究);每次通过聚集索引树进行index seek,IO开销最坏情况下是一个根节点,一个中间级节点,一个数据页,一共要seek100次,开销300个逻辑IO。综上,通过nonclustered index seek总共开销是305个IO。
要知道,我们的基础表数据页一共才250页,这说明了啥?说明就算是我从头到尾扫描一遍表也比noncustered index seek快。这时,SQL2k5会产生一个完完全全的clustered index scan执行计划来搞定表扫描。
好了,现在我们再来分析select * from tb1 where col2 = 1。假设它的结果集为5行。如果这时还是进行nonclustered index seek的话,逻辑IO按照上面相似的分析,应该是19个IO,远远要小于整个的clustered index scan。这时,SQLServer自然会采用nonclustered index seek。
我们再来看聚集索引。聚集索引和非聚集索引最大的不同在于聚集索引的存储顺序就是基础表的物理存储顺序。还是上面的表tb,假设聚集索引建在了col1上.如果where条件是col1 = XX的话,自然是index seek,因为IO最小,撑死了只有3(一个聚集索引根节点页,一个聚集索引中间级节点页,一个数据页);如果where条件是col1 XX的话,不管行集是多大,SQLServer总是首先通过index seek拿到XX对应的数据页,然后挨梆往后遍历基础表数据页到尾巴就OK了。最坏情况XX恰好比表中最小的col1小,那就读取所有行。如果where条件是col1 XX,那就倒着检索聚集索引,无他。
OK,到这里,我们明白了为啥SQLServer会选择index seek和index scan。也顺便明白了通过非聚集索引查询时,结果集相对总行数多寡对查询计划选择的巨大影响。
(结果集/总行数)被称为选择性,比值越大,选择性就越高。
你得到了它,本文的重点就是选择性。
统计信息,说白了,就是表中某个字段取某个值时有多少行结果集。统计信息可以说是一种选择性的度量,SQLServer就是根据它来估算不同查询计划的优劣。
?
后面将通过一个实际的例子来说明统计信息对查询计划的影响。
?
以下是示例表的表结构:
各位可以注意到,该表上有一个identity字段charge_no,聚集索引就创建在它上面。有两个非聚集索引indx_category_no,indx_provider_no,我们重点关注indx_provider_no。现在来看看provider_no字段的统计信息(有点长,我前边粘一部分,后边粘一部分):
(上述各字段含义,见联机文档对DBCC SHOW_STATISTICS的描述)
从上面的贴图可以看到,表中总行数
您可能关注的文档
- 内蒙古自治区开发区总体发展规划.doc
- 内蒙古自治区烟草公司赤峰市公司滥用市场支配地位行为的处罚决定.doc
- 内蒙古自治区科普资源开发与共享工程实施工作方案.doc
- 内蒙古草原文化旅游空间略论.doc
- 内蒙古褐煤固体热载体法快速热解技术示范工程项目.doc
- 内蒙古阿拉善地区生态困局与对策.doc
- 内蒙古通辽公选考试基础知识之国情国力国土与资源.doc
- 内蒙古通辽公选考试基础知识之管理现代领导决策体制.doc
- 内蒙竞赛理论考试试卷.doc
- 内衣生产工艺.doc
- 儿童生长发育监测与干预方法.pptx
- 第22课《皇帝的新装》课件+++++++++++++2025-2026学年统编版语文七年级上册.pptx
- 汉服产业电商直播营销效果提升策略研究报告.docx
- 2025年运动装备电商跨境物流中心物流配送模式创新报告.docx
- 智慧农业数据共享平台建设:农业物联网与大数据驱动的产业发展报告.docx
- 新解读《GB_T 42164-2022皮革 化学试验 热老化条件下六价铬含量的测定》.docx
- 2025年认知症照护机构服务流程标准化与机构品牌建设研究报告.docx
- 二手潮品交易信用评级体系与市场秩序维护策略.docx
- 碳中和目标引领,化工行业绿色生产与环保材料应用报告.docx
- 盲盒收藏市场消费心理,2025行业分析及预测.docx
文档评论(0)