深入理解Sql Server中的表扫描

作者:huangxincheng 时间:2024-01-27 09:05:33 

很久以前我们在写sql的时候,最怕的一件事情就是sql莫名奇妙的超级慢,慢的是撸一管子回来,那个小球还在一直转。。。这个着急也只有当事人才明白,后来听说有个什么“评估执行计划“,后来的后来才明白应该避免表扫描。。。

一:表扫描

1.现象

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

深入理解Sql Server中的表扫描

 

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

 

 深入理解Sql Server中的表扫描

   果然是看到了万恶的“表扫描”三个字,既然是万恶的东西,我们一定要深刻了解下,然后我们才可以怎么去想办法避免它。。。所以我们一定要理解到本质,那问题来了,它到底是怎么扫的呢???怎么破呢?这个还必须得从数据页说起。。。

 二: 深刻理解表扫描

1:数据页

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

让你眼见为实。

深入理解Sql Server中的表扫描

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

<1>:dbcc ind 命令

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

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

深入理解Sql Server中的表扫描

  <2>:PageFID,PagePID,IAMFID

刚才也说了,数据页有很多种,默认说的都是表数据页,其实还有IAM数据页,没什么稀奇的,IAM就是用来跟踪表数据页的,所以上面的图中,IAMFID字段为Null的记录就是IAM页,下面的PagePID=78的,就是表数据页。

 2.查看数据页

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

深入理解Sql Server中的表扫描

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

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

要做两件事情:

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

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

 数据页头(PAGE HEADER):

 深入理解Sql Server中的表扫描

数据内容(Page Data): 

 深入理解Sql Server中的表扫描

数据槽位(Page Slot):

 深入理解Sql Server中的表扫描

 

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

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

标签:Sql,Server,表扫描
0
投稿

猜你喜欢

  • python turtle 绘制太极图的实例

    2022-12-31 13:15:12
  • Python基础语言学习笔记总结(精华)

    2023-08-26 21:37:23
  • python实现五子棋程序

    2022-05-26 23:24:31
  • BootStrap创建响应式导航条实例代码

    2023-08-09 02:09:55
  • 浅谈python数据类型及类型转换

    2023-08-28 15:25:32
  • aspx中的mysql操作类sqldatasource使用示例分享

    2024-01-21 17:10:14
  • 利用python实现汉字转拼音的2种方法

    2023-12-08 09:58:50
  • Golang并发读取文件数据并写入数据库的项目实践

    2024-01-29 07:22:50
  • Python根据输入参数计算结果的实例方法

    2021-12-15 08:30:45
  • SQL Server Table中XML列的操作代码

    2024-01-23 14:21:11
  • Python列表切片操作实例总结

    2023-01-30 16:06:57
  • 利用python list完成最简单的DB连接池方法

    2022-04-19 18:38:00
  • pycharm中创建sql文件及模板的过程

    2021-10-01 14:50:51
  • antd项目实现彩蛋效果的详细代码

    2023-09-14 12:51:20
  • python爬取梨视频生活板块最热视频

    2023-12-30 09:38:56
  • 网站大改版=壮烈的死亡 ?

    2009-04-03 14:09:00
  • python 爬取影视网站下载链接

    2022-07-30 00:59:42
  • python pandas时序处理相关功能详解

    2023-07-25 12:03:18
  • ThinkPHP基于think-queue的队列插件实现消息推送

    2023-05-25 05:59:12
  • 详解pycharm配置python解释器的问题

    2022-10-14 13:22:08
  • asp之家 网络编程 m.aspxhome.com