SQL Server Management Studio 是一个交互式图形工具,使数据库管理员或开发人员可以编写查询、同时执行多个查询、查看结果、分析查询计划以及获得提高查询性能的帮助。
如何开启执行计划
执行计划需要关注的几个点
1.步骤影响的行可以根据连接线的粗细来判断
2.sql查询数据的方式
3.图形执行计划从右到左,从上到下看
下面是Sql Server查询数据的五种方式,这对我们理解执行计划非常重要。五种方式如下。
- 【Table Scan】:遍历整个表来查找匹配的数据行,速度最慢。
- 【Index Scan】:依据索引先从表中过滤出一部分记录,然后再查找所有匹配的数据行。查询速度比Table Scan稍快。
- 【Index Seek】:依据索引,定位记录的存放位置,然后再取得记录,因此,其查询速度比前面两种都快。
- 【Clustered Index Scan】:按聚集索引(一般是主键)遍历整个表,因为它的记录就是按聚集索引来顺序存放的。注意它与Table Scan的区别,其实它们都是进行全表扫描,只不过Table Scan是不带索引的扫描,而Clustered Index Scan是按聚集索引扫描的。(效率和Table Scan差不多)
- 【Clustered Index Seek】:聚集索引获取记录,它是直接拿到那条记录,而没有进行全表扫描,因此它的查询速度是最快的。
根据执行计划细节要做的优化操作
-
如果select * 通常情况下聚集索引会比非聚集索引更优。
-
如果出现Nested Loops,需要查下是否需要聚集索引,非聚集索引是否可以包含所有需要的列。
-
Merge Join时需要检查下原有的集合是否已经有排序,如果没有排序,使用索引能否解决。
-
出现表扫描,聚集索引扫描,非聚集索引扫描时,考虑语句是否可以加where限制,select * 是否可以去除不必要的列。
-
出现Rid查找时,是否可以加索引优化解决。
-
在计划中看到不是你想要的索引时,看能否在语句中强制使用你想用的索引解决问题,强制使用索引的办法Select CluName1,CluName2 from Table with(index=IndexName)。
-
看到不是你想要的连接算法时,尝试强制使用你想要的算法解决问题。强制使用连接算法的语句:select * from t1 left join t2 on t1.id=t2.id option(Hash/Loop/Merge Join)
-
看到不是你想要的聚合算法是,尝试强制使用你想要的聚合算法。强制使用聚合算法的语句示例:select age ,count(age) as cnt from t1 group by age option(order/hash group)
-
看到不是你想要的解析执行顺序是,或这解析顺序耗时过大时,尝试强制使用你定的执行顺序。option(force order)
-
看到有多个线程来合并执行你的sql语句而影响到性能时,尝试强制是不并行操作。option(maxdop 1)
-
在存储过程中,由于参数不同导致执行计划不同,也影响啦性能时尝试指定参数来优化。option(optiomize for(@name=‘zlh’))
-
不操作多余的列,多余的行,不做务必要的聚合,排序