[转帖]sqlserver执行计划需要关注的几个点
当前位置:点晴教程→知识管理交流
→『 技术文档交流 』
执行计划需要关注的几个点 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】:聚集索引获取记录,它是直接拿到那条记录,而没有进行全表扫描,因此它的查询速度是最快的。
create CLUSTERED INDEX IX_Id ON Person(Id) --创建聚簇索引 create NONCLUSTERED INDEX IX_Name ON Person(Name) --创建非聚集索引 drop INDEX Person.IX_Id --删除索引 根据执行计划细节要做的优化操作 如果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’)) 不操作多余的列,多余的行,不做务必要的聚合,排序 该文章在 2023/7/26 9:41:54 编辑过 |
关键字查询
相关文章
正在查询... |