sqlserver 执行计划
当前位置:点晴教程→知识管理交流
→『 技术文档交流 』
想复杂的事情简单说,在看执行计划的其他文章的时候,发现直接上很复杂的DDL脚本来讲解,这样子可能打开就没有兴趣往下看了。所以这里用了一个最简单的select语句进行说明引新入门。 打开 注意这三个【L型图标】,可以把鼠标移动到按钮上方可以显示【解释文字】。 图中从左到右分别为【显示估计的执行计划】【包括实际的执行计划】【包括实时查询统计信息】。 【显示估计的执行计划】是执行某个DDL的估计值。 【包括实际的执行计划】【包括实时查询统计信息】都是执行实际的值,所以你选择后,它会在下次执行后出执行结果。
结果分析 这是一个简单的查询,鼠标点击图片中的图片或线上都有惊喜(大量细节信息展示)。执行计划可以通过“另存”操作将某一次结果保留下来,方便与日后进行结果对比。 除了图标外,线的粗细代表涉及到的数据量的大小,越粗代表数据量越大。
执行计划元素列表如下:
执行计划元素列表解释请参考: Graphical execution Plan Icons (SQL Server Management Studio) 结果细节图
其中,第三个图中的属性Ordered是与order by相关。如下面两个脚本: select * from vvtest order by id; select * from vvtest 两个执行计划的结果如下:
所谓数据访问就是直接访问数据,可以是访问一个表也可以是访问一个索引。 通常有两种方法:一种是扫描(scan)一种是查找(seek)。 scan就是读取整个结构,可以访问一个heap或者一个clustered索引或者一个non-clustered索引。 seek不会读取整个结构,他则是更高效地通过索引访问一行,所以从这个角度来看,查找就只能应用在索引上面了。简单总结如下表所示: 首先分析最右边的Table Scan。这是sqlserver 查询数据的方法。sqlserver 数据查询方式一共有五种: 1. 【Table Scan】:遍历整个表,查找所有匹配的记录行。这个操作将会一行一行的检查,当然,效率也是最差的。 2. 【Index Scan】:根据索引,从表中过滤出来一部分记录,再查找所有匹配的记录行,显然比第一种方式的查找范围要小,因此比【Table Scan】要快。 3. 【Index Seek】:根据索引,定位(获取)记录的存放位置,然后取得记录,因此,比起前二种方式会更快。 4. 【Clustered Index Scan】:和【Table Scan】一样。注意:不要以为这里有个Index,就认为不一样了。 其实它的意思是说:按聚集索引来逐行扫描每一行记录,因为记录就是按聚集索引来顺序存放的。 而【Table Scan】只是说:要扫描的表没有聚集索引而已,因此这二个操作本质上也是一样的。 5. 【Clustered Index Seek】:直接根据聚集索引获取记录,最快! 所以总体来讲,在查询结果集是相同数量的情况下,查询速度排序为5>3>2>4>1。 一般而言,在性化时可以看到执行记录时是不是【Table Scan】或者【Clustered Index Scan】,如果是,可以通过增加或修改索引类型进行效率上的对比。 Lookup类型 Bookmark Lookup、RID Lookup、Key Lookup。 Bookmark Lookup和Key Lookup是一个意思,等价。 如果表没有创建聚集索引则称为Bookmark Lookup,如果表中没有聚集索引但是存在非聚集索引我们称为RID Lookup。 为什么突然扯了一嘴Lookup呢?因为Lookup其实就是与执行计划里的scan或index相关。如果聚集索引命中就是指Bookmark Lookup——聚集索引命中的时候,很大概率是索引不能带出select所需的某一部分字段或者是全部字段,所以需要先命中一行,然后把某一行的数据全带出来。非聚集索引命中就是指RID Lookup。 SQL SERVER如何选择执行计划 sqlserver选择某个执行计划,执行计划用某个索引,是这有一个权重判断的。这个权重在执行前都计算出来了。 那怎么查看呢——通过【索引统计信息】。在执行脚本的过程中,sqlserver会根据这些统计信息,选择一个它认为是最合适的方法去执行查询过程。统计信息可以自动定时更新,在SQL Server中也有个参数来控制这个更新方式。
语法 DBCC SHOW_STATISTICS ("Person.Address", AK_Address_rowguid); 这里的引号很重要,没会报错。 主要有两个参数: 第一个:是表名或者是索引视图名(给视图加的索引) 第二个:索引名、列名、统计信息。 结果属性介绍 索引前缀集是什么?索引前缀和前缀索引不是一个东西。 索引前缀是指索引的选择性——根据索引定义时的字段顺序来决定索引是否被命中。如果是索引(a,b,c),命中查询的时候是查询条件中有(a) (a,b) (a,b,c)进行命中,但是(b,c)这个查询条件不会命中该索引。所以索引前缀也叫索引列前缀集。 前缀索引说白了就是对文本的前几个字符(具体是几个字符在建立索引时指定)建立索引,这样建立起来的索引更小,所以查询更快。
执行计划详细属性介绍
在执行DDL之前,输入一句set statistics profile on 。显示一个表格,表格内是比图上更细节的实际的执行信息。针对这个表的属性做一个整理解析。
该文章在 2023/7/26 8:49:40 编辑过 |
关键字查询
相关文章
正在查询... |