Sql Server之旅——第二站 理解万恶的表扫描

很久以前我们在写sql的时候,最怕的一件事情就是sql莫名奇妙的超级慢,慢的是撸一管子回来,那个小球还在一直转。。。这个着急也只有当事人才

明白,后来听说有个什么“评估执行计划“,后来的后来才明白应该避免表扫描。。。

一:表扫描

1.现象

  ”表扫描“听起来很简单,不就是一行一行的扫嘛,你要说”执行计划”的话,我也会玩,为了更可观,我build一个表,再插入三行数据,如下图:

 

上面的Person我是一个索引都没建,然后where一下,看看表扫描是啥样的???

 

 

   果然是看到了万恶的“表扫描”三个字,既然是万恶的东西,我们一定要深刻了解下,然后我们才可以怎么去想办法避免它。。。所以我们一定要理解到本

质,那问题来了,它到底是怎么扫的呢???怎么破呢?这个还必须得从数据页说起。。。

 

二: 深刻理解表扫描

1:数据页

    这个学sqlserver的没有理由说不知道,我们的记录都是以数据页形式存储的,而且还应该知道数据页的大小是8k。。。。那数据页在哪里?我可以

让你眼见为实。

乍一看我画了好多,千万不要怕,不要以为画的多,就以为高深了。。。我简单的剖析下。

<1>:dbcc ind 命令

 你要是想看数据页的相关情况,sqlserver还真提供了专用命令dbcc 满足你,你可能会问sqlserver中有提供ind命令的参数吗?告诉你吧,还真有

的,不过这个要开启2588跟踪,就像下面这样。

  <2>:PageFID,PagePID,IAMFID

  刚才也说了,数据页有很多种,默认说的都是表数据页,其实还有IAM数据页,没什么稀奇的,IAM就是用来跟踪表数据页的,所以上面的图中,

IAMFID字段为Null的记录就是IAM页,下面的PagePID=78的,就是表数据页。

 

2.查看数据页

  为避免大家糊涂了,我先还是说说数据页内部结构大概是个什么样子,好让大家有个整体印象。

 从图中可以看到,在数据页的尾部是有很多槽位的,这些槽位指向了Data区域中一条条实际记录的地址,所以说表扫描,其实就是扫这些Slot槽位,

还是拿上面的Person表中的三条记录来说,他们都是保存在78号数据页中,现在出于好奇心把78号数据页导出来,说干就干。。。。很简单,你需

要做两件事情:

<1>开启3604跟踪: dbcc traceon(3604)

<2>使用dbcc page 命令导出1号文件下面的78号数据页(pageFID:pagePID)=(1:78),就像下面这样。。。

 

数据页头(PAGE HEADER):

 

数据内容(Page Data): 

 

数据槽位(Page Slot):

 

 

有没有看到上面(0,1,2)三个槽位,并且都有相应的偏移地址(0x7e,0x92,0xba),这个地址就指向了Data区域实际记录的偏移地址。

好了,到此为止吧,不能再往下说了,洗洗睡了。

 

分类:  sql server
20
0
关注我
« 上一篇: Sql Server之旅——第一站 那些给我们带来福利的系统视图
» 下一篇: Sql Server之旅——第三站 解惑那些背了多年聚集索引的人
posted @  2015-01-15 22:59  一线码农 阅读( 4035) 评论( 21编辑  收藏

  
#1楼 2015-01-16 08:39  jeatime6   
每次都是看到文章里的Ctrip才知道又是楼主。
  
#2楼 2015-01-16 09:27  潇湘隐者   
能讲解得这么通熟易懂。确实不易!赞一个
  
#3楼 2015-01-16 09:28  小宝er   
大神,我又来膜拜你了。么么哒
  
#4楼 2015-01-16 09:31  dotnetgeek   
请问,你是看哪本书知道这些知识的?还是参考某位博主的文章?谢谢。
  
#5楼 2015-01-16 09:36  @清道夫   
一线一着急就去撸管吗????
  
#6楼 2015-01-16 09:37  小宝er   
@ @清道夫
恍然大悟
  
#7楼 2015-01-16 13:19  不可‘为空   
一管子几秒。。。
  
#8楼 2015-01-16 14:43  CareySon   
为什么表扫描是万恶的?
  
#9楼 2015-01-16 15:09  greystar   
果然资本主义都是万恶的。
  
#10楼 [ 楼主2015-01-16 16:15  一线码农   
@ jeatime6
哈哈,千万不要条件反射啦~
  
#11楼 [ 楼主2015-01-16 16:15  一线码农   
@ 潇湘隐者
有自己的思想在里面就比较通俗易懂了~
  
#12楼 [ 楼主2015-01-16 16:15  一线码农   
@ 小宝er
小乖呀,么么哒~
  
#13楼 [ 楼主2015-01-16 16:16  一线码农   
@ @清道夫
撸个蛋。。。
  
#14楼 [ 楼主2015-01-16 16:16  一线码农   
@ dotnetgeek
sql server 数据库技术内幕
  
#15楼 [ 楼主2015-01-16 16:17  一线码农   
@ 不可‘为空
这个。。。公共场合。。。
  
#16楼 [ 楼主2015-01-16 16:21  一线码农   
@ greystar
哈哈,谢谢支持。
  
#17楼 [ 楼主2015-01-16 16:21  一线码农   
@ CareySon
你不会喜欢表扫描吧。。。
  
#18楼 2015-01-16 21:20  罗里罗嗦夫斯基   
表扫描万恶吗??

有时候,表扫描不比index seek慢的。

一般返回的表的大部分数据量,表扫描还是划算的。
  
#19楼 2015-01-16 21:41  桦仔   
我也想问“表扫描为啥是万恶的?????????”
  
#20楼 2015-01-17 13:00  CareySon   
@ 一线码农
我喜不喜欢不重要-。-既然出现了就是优化器喜欢。每一种操作符存在既合理。表扫描当然有其适用场景,优化过程中如果以消除表扫描为目标就本末倒置了。这也是从DBA视角看开发最常见的误区之一
  
#21楼 2015-01-17 15:29  webFollower   
简明易懂!厉害!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值