Sql Server之旅——第二站 理解万恶的表扫描
2015-01-16 14:11
162 查看
很久以前我们在写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之旅——第二站 理解万恶的表扫描
- Sql Server之旅——第二站 理解万恶的表扫描
- Sql Server之旅——第二站 理解万恶的表扫描
- Sql Server之旅——第二站 理解万恶的表扫描
- Sql Server之旅——第二站 理解万恶的表扫描
- Sql Server之旅——第二站 理解万恶的表扫描
- 深入理解Sql Server中的表扫描
- SQL Server 查询分析器的执行计划中的扫描方式,举例理解
- SQL Server 索引结构及其使用(一)--深入浅出理解索引结构第1/4页
- 【读书笔记】软件工程·实践者的研究方法第7版 第二部分 建模 第5章 理解需求
- 第三篇——第二部分——第一文 SQL Server镜像简介
- 理解虚拟键码,扫描码和ASCII字符码
- 理解SQL Server 2000的信任连接(Trusted connection)
- 第三篇——第二部分——第四文 配置SQL Server镜像——非域环境
- 理解SQL Server中索引的概念,原理
- 理解虚拟键码,扫描码和ASCII字符码
- 基于Windows Server 2008 R2的Failover Cluster(故障转移群集)部署Sql Server 2008 AA(主主) 模式群集(第二部分)
- (转)理解SQL SERVER中的分区表
- SQL Server 2012笔记分享-8:理解包含数据库
- Datastax文档Apache Cassandra v2.1 第二部分 理解Cassandra架构_节点间通信(Gossip)