很久以前我们在写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之旅——第二站 理解万恶的表扫描的更多相关文章

  1. Sql Server之旅——第九站 看公司这些DBA们设计的这些复合索引

    这一篇再说下索引的最后一个主题,索引覆盖,当然学习比较好的捷径是看看那些大师们设计的索引,看从中能提取些什么营养的东西,下面我们看 看数据库中一个核心的Orders表. 一:查看表的架构 <1& ...

  2. Sql Server之旅——第一站 那些给我们带来福利的系统视图

    本来想这个系列写点什么好呢,后来想想大家作为程序员,用的最多的莫过于数据库了,但是事实上很多像我这样工作在一线的码农,对sql 都一知半解,别谈优化和对数据库底层的认识了,我也是这样... 一:那些系 ...

  3. Sql Server之旅——第五站 确实不得不说的DBCC命令

    原文:Sql Server之旅--第五站 确实不得不说的DBCC命令 今天研发中心办年会,晚上就是各自部门聚餐了,我个人喜欢喝干红,在干红中你可以体味到那种酸甜苦辣...人生何尝不是这样呢???正好 ...

  4. (转)Sql Server之旅——第八站 复合索引和include索引到底有多大区别?

    索引和锁,这两个主题对我们开发工程师来说,非常的重要...只有理解了这两个主题,我们才能写出高质量的sql语句,在之前的博客中,我所说的 索引都是单列索引...当然数据库不可能只认单列索引,还有我这篇 ...

  5. SQL Server代理(5/12):理解SQL代理错误日志

    SQL Server代理是所有实时数据库的核心.代理有很多不明显的用法,因此系统的知识,对于开发人员还是DBA都是有用的.这系列文章会通俗介绍它的很多用法. 如我们在这个系列的前几篇文章所见,SQL ...

  6. is-a,has-a,like-a是什么 sql server中,N''表示什么意思? 关于SQL SERVER的N前缀的理解

    https://blog.csdn.net/ooppookid/article/details/51174122#commentBox 1.is-a,has-a,like-a是什么 在面向对象设计的领 ...

  7. SQL Server 游标运用:查看所有数据库所有表大小信息(Sizes of All Tables in All Database)

    原文:SQL Server 游标运用:查看所有数据库所有表大小信息(Sizes of All Tables in All Database) 一.本文所涉及的内容(Contents) 本文所涉及的内容 ...

  8. SQL Server 更改跟踪(Chang Tracking)监控表数据

    一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 主要区别与对比(Compare) 实现监控表数据步骤(Process) 参考文献(Refere ...

  9. SQL Server 2008 安装过程中遇到“性能计数器注册表配置单元一致性”检查失败 问题的解决方法

    操作步骤: 1. 在 Microsoft Windows 2003 或 Windows XP 桌面上,依次单击"开始"."运行",然后在"打开&quo ...

随机推荐

  1. C#DateTimePicker控件问题

    DateTimPicker控件在遇到29这样特殊的日期,选择时可能会出现 解决方案:在属性中把Value值设置为除29日外的其他日期或者在代码中直接设置Value值:DateTimePicker1 = ...

  2. FreeBSD应该装gnome3做桌面

    目前freebsd pkg包管理体系的repo源多了一些,速度快了很多. 仓库中目前的版本为3.14,安装gnome3很简单. pkg install xorg gnome3 echo "e ...

  3. python 学习笔记5(深浅拷贝与集合)

    拷贝 我们已经详细了解了变量赋值的过程.对于复杂的数据结构来说,赋值就等于完全共享了资源,一个值的改变会完全被另一个值共享. 然而有的时候,我们偏偏需要将一份数据的原始内容保留一份,再去处理数据,这个 ...

  4. loadrunner11中java vuser引用jar包

    1.创建工程,新建类,HelloWorld.java,代码如下: package com.liuke; public class HelloWorld { public String getHello ...

  5. 解决WindowsServer 2008 R2 未注册版一个小时自动强制关机

    仅用来学习交流,请大家购买正版,尊重正版版权. 安装了win2008R2,试了很多激活方法,终于激活后,不知道什么原因,过了一段时间后,每隔一段时间就自动关机,查了一下,发现是 wlms.exe在作祟 ...

  6. String类型中ToString hashCode equals compareTo等方法的经典实现

    private final char value[]; private int hash; // Default to 0 public String(String original) { this. ...

  7. com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure 解决办法

    09:00:30.307 [http-8080-6] ERROR org.hibernate.transaction.JDBCTransaction -JDBC begin failed com.my ...

  8. css知多少(7)——盒子模型

    1. 引言 从这一节开始,我们就进入本系列的第三部分——css呈现.本部分将描述css在页面的几种布局和呈现的特性.包括两类:文字.块. 第一类——文字.这部分相对比较简单一些,例如设置字号.字体.颜 ...

  9. jQuery cbpContentSlider 滑动切换

    cbpContentSlider是一款选项卡插件,只要按照以下html结构就可以自动生成菜单切换内容特效. 在线实例 实例演示 使用方法 <div id="cbp-contentsli ...

  10. Perfect Scrollbar – 完美的 jQuery 滚动条插件

    Perfect Scrollbar 是一个很小的,但完美的 jQuery 滚动插件.滚动条不会影响原来的设计布局,滚动条的设计是完全可定制的.你可以改变几乎所有的 CSS 样式的滚动条,滚动条设计对脚 ...