SQL Server中的执行引擎入门 图解
来源:asp之家 时间:2012-06-06 20:08:26
本文旨在分类讲述执行计划中每一种操作的相关信息。
数据访问操作
首先最基本的操作就是访问数据。这既可以通过直接访问表,也可以通过访问索引来进行。表内数据的组织方式分为堆(Heap)和B树,其中表中没有建立聚集索引时数据是通过堆进行组织的,这个是无序的,表中建立聚集索引后和非聚集索引的数据都是以B树方式进行组织,这种方式数据是有序存储的。通常来说,非聚集索引仅仅包含整个表的部分列,对于过滤索引,还仅仅包含部分行。
除去数据的组织方式不同外,访问数据也分为两种方式,扫描(Scan)和查找(Seek),扫描是扫描整个结构的所有数据,而查找只是查找整个结构中的部分数据。因此可以看出,由于堆是无序的,所以不可能在堆上面进行查找(Seek)操作,而相对于B树的有序,使得在B树中进行查找成为可能。当针对一个以堆组织的表进行数据访问时,就会进行堆扫描,如图1所示。
图1.表扫描
可以看出,表扫描的图标很清晰的表明表扫描的性质,在一个无序组织表中从头到尾扫描一遍。
而对于B树结构的聚集索引和非聚集索引,同样可以进行扫描,通常来讲,为了获取索引表中的所有数据或是获得索引行树占了数据大多数使得扫描的成本小于查找时,会进行聚集索引扫描。如图2所示。
图2.聚集索引扫描
聚集索引扫描的图标也同样能够清晰的表明聚集索引扫描的性质,找到最左边的叶子节点后,依次扫描所有叶子节点,达到扫描整个结构的作用。当然对于非聚集索引也是同样的概念,如图3所示。
图3.非聚集索引的扫描
而对于仅仅选择B树结构中的部分数据,索引查找(Seek)使得B树变得有意义。根据所查找的关键值,可以使得从仅仅从B树根部向下走单一路径,因此免去了扫描不必要页的消耗,图4是查询计划中的一个索引查找。
图4.聚集索引查找
索引查找的图标也是很传神的,可以看到图标那根线从根节点一路向下到叶子节点。也就是找到所求数据所在的页,不难看出,如果我们需要查找多条数据且分散在不同的页中,这个查找操作需要重复执行很多回,当这个次数大到一定程度时,SQL Server会选择消耗比较低的索引扫描而不是再去重复索引查找。对于非聚集索引查找,概念是一样的,就不再上图片了。
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
基于Python对象引用、可变性和垃圾回收详解
![](https://img.aspxhome.com/file/2023/8/107648_0s.jpg)
python windows安装cuda+cudnn+pytorch教程
![](https://img.aspxhome.com/file/2023/8/107038_0s.png)
JavaScript字符串包含问题
详解Python中with语句的用法
python config文件的读写操作示例
MYSQL复杂查询练习题以及答案大全(难度适中)
![](https://img.aspxhome.com/file/2023/4/119764_0s.png)
收集的ORACLE函数大全
python实现录音功能(可随时停止录音)
Python代码阅读--列表元素逻辑判断
Python类如何定义私有变量
:hover在IE6下的问题
python-序列解包(对可迭代元素的快速取值方法)
asp清空站点缓存
python脚本框架webpy模板赋值实现
![](https://img.aspxhome.com/file/2023/4/70024_0s.png)
ASPError(err)对象的相关基础知识
Pytorch中使用TensorBoard详情
![](https://img.aspxhome.com/file/2023/3/115423_0s.gif)
如何用python批量发送工资条邮件
![](https://img.aspxhome.com/file/2023/5/86455_0s.png)