设为首页 收藏本站
查看: 759|回复: 0

[经验分享] Sql Server之旅——第二站 理解万恶的表扫描

[复制链接]

尚未签到

发表于 2015-6-27 05:36:38 | 显示全部楼层 |阅读模式
  很久以前我们在写sql的时候,最怕的一件事情就是sql莫名奇妙的超级慢,慢的是撸一管子回来,那个小球还在一直转。。。这个着急也只有当事人才
  明白,后来听说有个什么“评估执行计划“,后来的后来才明白应该避免表扫描。。。
  一:表扫描
  1.现象
  ”表扫描“听起来很简单,不就是一行一行的扫嘛,你要说”执行计划”的话,我也会玩,为了更可观,我build一个表,再插入三行数据,如下图:
DSC0000.png
  
  上面的Person我是一个索引都没建,然后where一下,看看表扫描是啥样的???
  
DSC0001.png
  果然是看到了万恶的“表扫描”三个字,既然是万恶的东西,我们一定要深刻了解下,然后我们才可以怎么去想办法避免它。。。所以我们一定要理解到本
  质,那问题来了,它到底是怎么扫的呢???怎么破呢?这个还必须得从数据页说起。。。
  
  二: 深刻理解表扫描
  1:数据页
  这个学sqlserver的没有理由说不知道,我们的记录都是以数据页形式存储的,而且还应该知道数据页的大小是8k。。。。那数据页在哪里?我可以
  让你眼见为实。
DSC0002.png
  乍一看我画了好多,千万不要怕,不要以为画的多,就以为高深了。。。我简单的剖析下。
  :dbcc ind 命令
  你要是想看数据页的相关情况,sqlserver还真提供了专用命令dbcc 满足你,你可能会问sqlserver中有提供ind命令的参数吗?告诉你吧,还真有
  的,不过这个要开启2588跟踪,就像下面这样。
DSC0003.png
    :PageFID,PagePID,IAMFID
  刚才也说了,数据页有很多种,默认说的都是表数据页,其实还有IAM数据页,没什么稀奇的,IAM就是用来跟踪表数据页的,所以上面的图中,
  IAMFID字段为Null的记录就是IAM页,下面的PagePID=78的,就是表数据页。
  
  2.查看数据页
  为避免大家糊涂了,我先还是说说数据页内部结构大概是个什么样子,好让大家有个整体印象。
DSC0004.png
  从图中可以看到,在数据页的尾部是有很多槽位的,这些槽位指向了Data区域中一条条实际记录的地址,所以说表扫描,其实就是扫这些Slot槽位,
  还是拿上面的Person表中的三条记录来说,他们都是保存在78号数据页中,现在出于好奇心把78号数据页导出来,说干就干。。。。很简单,你需
  要做两件事情:
  开启3604跟踪: dbcc traceon(3604)
  使用dbcc page 命令导出1号文件下面的78号数据页(pageFID:pagePID)=(1:78),就像下面这样。。。
  
  数据页头(PAGE HEADER):
DSC0005.png
  数据内容(Page Data):
DSC0006.png
  数据槽位(Page Slot):
DSC0007.png
  
  有没有看到上面(0,1,2)三个槽位,并且都有相应的偏移地址(0x7e,0x92,0xba),这个地址就指向了Data区域实际记录的偏移地址。
  好了,到此为止吧,不能再往下说了,洗洗睡了。
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-80840-1-1.html 上篇帖子: SQL Server 连接字符串和身份验证 学习 下篇帖子: SQL Server 备份和还原全攻略
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表