SQL Server Management Studio 是一个交互式图形工具,使数据库管理员或开发人员可以编写查询、同时执行多个查询、查看结果、分析查询计划以及获得提高查询性能的帮助。

如何开启执行计划

sql server 预执行 sqlserver执行计划怎么看_非聚集索引

执行计划需要关注的几个点

1.步骤影响的行可以根据连接线的粗细来判断

2.sql查询数据的方式

3.图形执行计划从右到左,从上到下看

下面是Sql Server查询数据的五种方式,这对我们理解执行计划非常重要。五种方式如下。

  1. 【Table Scan】:遍历整个表来查找匹配的数据行,速度最慢。
  2. 【Index Scan】:依据索引先从表中过滤出一部分记录,然后再查找所有匹配的数据行。查询速度比Table Scan稍快。
  3. 【Index Seek】:依据索引,定位记录的存放位置,然后再取得记录,因此,其查询速度比前面两种都快。
  4. 【Clustered Index Scan】:按聚集索引(一般是主键)遍历整个表,因为它的记录就是按聚集索引来顺序存放的。注意它与Table Scan的区别,其实它们都是进行全表扫描,只不过Table Scan是不带索引的扫描,而Clustered Index Scan是按聚集索引扫描的。(效率和Table Scan差不多)
  5. 【Clustered Index Seek】:聚集索引获取记录,它是直接拿到那条记录,而没有进行全表扫描,因此它的查询速度是最快的。
CREATE CLUSTERED INDEX IX_Id ON Person(Id)   --创建聚簇索引
CREATE NONCLUSTERED INDEX IX_Name ON Person(Name)    --创建非聚集索引
DROP INDEX Person.IX_Id   --删除索引

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

  1. 如果select * 通常情况下聚集索引会比非聚集索引更优。
  2. 如果出现Nested Loops,需要查下是否需要聚集索引,非聚集索引是否可以包含所有需要的列。
  3. Merge Join时需要检查下原有的集合是否已经有排序,如果没有排序,使用索引能否解决。
  4. 出现表扫描,聚集索引扫描,非聚集索引扫描时,考虑语句是否可以加where限制,select * 是否可以去除不必要的列。
  5. 出现Rid查找时,是否可以加索引优化解决。
  6. 在计划中看到不是你想要的索引时,看能否在语句中强制使用你想用的索引解决问题,强制使用索引的办法Select CluName1,CluName2 from Table with(index=IndexName)。
  7. 看到不是你想要的连接算法时,尝试强制使用你想要的算法解决问题。强制使用连接算法的语句:select * from t1 left join t2 on t1.id=t2.id option(Hash/Loop/Merge Join)
  8. 看到不是你想要的聚合算法是,尝试强制使用你想要的聚合算法。强制使用聚合算法的语句示例:select age ,count(age) as cnt from t1 group by age option(order/hash group)
  9. 看到不是你想要的解析执行顺序是,或这解析顺序耗时过大时,尝试强制使用你定的执行顺序。option(force order)
  10. 看到有多个线程来合并执行你的sql语句而影响到性能时,尝试强制是不并行操作。option(maxdop 1)
  11. 在存储过程中,由于参数不同导致执行计划不同,也影响啦性能时尝试指定参数来优化。option(optiomize for(@name=‘zlh’))
  12. 不操作多余的列,多余的行,不做务必要的聚合,排序