阅读 83

sqlserver执行sql脚本,SQL执行计划

1、查看t-sql的执行计划,了解执行计划中的一些常识。

2、分析执行计划,找到优化sql性能的思路或方案。

如果您对优化sql查询的理解或常识不太了解,我们建议您使用几个博客,了解有关使用SqlServer性能检测和优化工具的详细信息、sql语句的优化分析以及T-sql语句查询的执行顺序。

执行计划摘要1、什么是执行计划?

经过对哥哥提交的sql语句、数据库查询优化程序和分析,生成多个数据库可以识别的高效查询执行方法。 然后,优化程序会在许多执行计划中找到资源使用最少的执行计划,而不是最快的执行计划,并以xml格式、文本格式或图形方式显示该执行计划。

2、预估执行计划,实际执行计划

如果选择语句并单击以上任一解释计划,则会立即显示解释计划,但在执行sql语句后会显示实际的解释计划。 估计的执行计划与实际的执行计划不同,但在大多数情况下,实际的执行计划与估计的执行计划一致。 如果统计信息发生更改或重新编译计划,则会产生不同的结果。

3、为什么要读懂执行计划

首先,在执行计划中,复杂的sql是如何执行的,是否按照您所想的计划执行,是否以最有效的方式执行,是否正在使用的索引,数据是如何排序的,以及数据是如何合并的。 官方数据显示,t-sql的执行存在问题,80%的人可以在执行计划中找到答案。

4、针对图形化执行计划分析

可以以文本、xml和图形形式查看执行计划。 该诈骗主要由图形执行计划主导分析,但执行计划包括78个可用操作员,本篇也只能分析常用的内容,常用的内容几乎包括了你所有的日常生活。 Msdn有图片介绍。 https://msdn.Microsoft.com/zh-cn/library/ms 175913 (v=SQL.90 ).aspx

5、怎么看执行计划

图形化的执行计划从上到下又从左到右。

6、清除缓存的执行计划

dbcc freeprocache

dbccflushprocindb(db_id ) )。

图形执行计划1、连线

1、越粗表示影响扫描的行数越多。

2、实际影响Actual Number of Rows扫描的行数。

3、EstimatedNumber of Rows估算扫描影响的行数。

Estimated row size操作符生成的行的估计大小(字节)。

5、Estimated Data Size估算影响的数据大小。

2、Tooltips,当前步骤执行信息

note:tips中的信息告诉我们要执行的操作是什么,采用的操作是什么,搜索的数据是什么,使用的索引是什么,是否排序,cpu、I/O、影响行数和实际行数等信息。 具体参数列表请参考msdn:https://msdn.Microsoft.com/zh-cn/library/ms 178071 (v=SQL.90 ).aspx

3、Table Scan(表扫描)

当表中没有聚合索引且没有合适的索引时,会发生此操作。 这个操作会消耗性能。 他的出现意味着优化程序遍历整个表以查找所需的数据。

4、Clustered Index Scan(聚集索引扫描)、Index Scan(非聚集索引扫描)

聚合索引扫描和非聚合索引扫描操作均可使用此图标。

聚合索引扫描:聚合索引中的数据卷实际上就是表本身。 也就是说,表的行数和列数,全部汇总起来就是行数列数。 那么,聚合索引扫描与表扫描相同。 它还会扫描所有表,检查所有表数据以查找所需的数据。

非聚集索引扫描:非聚集索引的卷取决于索引的创建情况,并且只能包含要查询的列。 非聚集索引扫描是指扫描非聚集中包含的列的所有行以查找所需的数据。

5、Key Lookup(键值查找)

首先,搜索和扫描在性能方面不是完全相同的级别。 扫描需要遍历整个表,而搜索只需直接从键值中提取数据并返回结果即可提高性能。

如果唯一蝴蝶要搜索的列未完全包含在非聚集索引中,则必须使用键值搜索来查找未包含在聚集索引中的列。

6、RID Lookoup(RID查找)

与键值搜索类似,但需要RID搜索

要查找的列没有完全被非聚集索引包含,而剩余的列所在的表又不存在聚集索引,不能键值查找,只能根据行表示Rid来查询数据。


7、Clustered Index Seek(聚集索引查找)、Index Seek(非聚集索引查找)


聚集索引查找和非聚集索引查找都是使用该图标。

聚集索引查找:聚集索引包含整个表的数据,也就是在聚集索引的数据上根据键值取数据。

非聚集索引查找:非聚集索引包含创建索引时所包含列的数据,在这些非聚集索引的数据上根据键值取数据。

8、Hash join   三种物理连接merge、Hash、Loop 模型:https://blog.csdn.net/hzp666/article/details/107847358

 

这个图标有两种地方用到,一种是表关联,一种是数据聚合运算时。

在分别说这两种运算的前面,我先说说Hashing(编码技术)和Hash Table(数据结构)。

Hashing:在数据库中根据每一行的数据内容,转换成唯一符号格式,存放到临时哈希表中,当需要原始数据时,可以给还原回来。类似加密解密技术,但是他能更有效的支持数据查询。

Hash Table:通过hashing处理,把数据以key/value的形式存储在表格中,在数据库中他被放在tempdb中。

接下来,来说说Hash Math的表关联跟行数据聚合是怎么操作运算的。

表关联:


如上图,关联两个数据集时,Hash Match会把其中较小的数据集,通过Hashing运算放入HashTable中,然后一行一行的遍历较大的数据集与HashTable进行相应的匹配拉取数据。

数据聚合:当查询中需要进行Count/Sum/Avg/Max/Min时,数据可能会采用把数据先放在内存中的HashTable中然后进行运算。

9、Loops Join


这个操作符号,把两个不同列的数据集汇总到一张表中。提示信息中的Output List中有两个数据集,下面的数据集(inner set)会一一扫描与上面的数据集(out set),直到扫描完为止,这个操作才算是完成。

10、Merge Join


这种关联算法是对两个已经排过序的集合进行合并。如果两个聚合是无序的则将先给集合排序再进行一一合并,由于是排过序的集合,左右两个集合自上而下合并效率是相当快的。

11、Sort(排序)


对数据集合进行排序,需要注意的是,有些数据集合在索引扫描后是自带排序的。

12、Filter(筛选)


根据出现在having之后的操作运算符,进行筛选

13、Computer Scalar

 

在需要查询的列中需要自定义列,比如count(*) as cnt ,select name+''+age 等会出现此符号。

根据执行计划细节要做的优化操作

这里会有很多建议给出,我不一一举例了,给出几个示例,想做到优化行家,多的还需要大家去悟去理解。

1、如果select * 通常情况下聚集索引会比非聚集索引更优。

2、如果出现Nested Loops,需要查下是否需要聚集索引,非聚集索引是否可以包含所有需要的列。

3、Hash Match连接操作更适合于需要做Hashing算法集合很小的连接。

4、Merge Join时需要检查下原有的集合是否已经有排序,如果没有排序,使用索引能否解决。

5、出现表扫描,聚集索引扫描,非聚集索引扫描时,考虑语句是否可以加where限制,select * 是否可以去除不必要的列。

6、出现Rid查找时,是否可以加索引优化解决。

7、在计划中看到不是你想要的索引时,看能否在语句中强制使用你想用的索引解决问题,强制使用索引的办法Select CluName1,CluName2 from Table with(index=IndexName)。

8、看到不是你想要的连接算法时,尝试强制使用你想要的算法解决问题。强制使用连接算法的语句:select * from t1 left join t2 on t1.id=t2.id option(Hash/Loop/Merge Join)

9、看到不是你想要的聚合算法是,尝试强制使用你想要的聚合算法。强制使用聚合算法的语句示例:select  age ,count(age) as cnt from t1 group by age  option(order/hash group)

10、看到不是你想要的解析执行顺序是,或这解析顺序耗时过大时,尝试强制使用你定的执行顺序。option(force order)

11、看到有多个线程来合并执行你的sql语句而影响到性能时,尝试强制是不并行操作。option(maxdop 1)

12、在存储过程中,由于参数不同导致执行计划不同,也影响啦性能时尝试指定参数来优化。option(optiomize for(@name='zlh'))

13、不操作多余的列,多余的行,不做务必要的聚合,排序。


文章分类
代码人生
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐