执行计画中有一个Number of Rows Read资讯,这篇我来简单介绍一下
之前我在公司分享如何分析和改善执行计画workshop,
细心的同事有发现到一个新的属性,就是Number of Rows Read,这
属性从SQL 2016开始新增,SQL Server开发团队提供该资讯,
我个人不得不赞叹一下,这资讯也是我个人在分析执行计画需要留意的。
Number of Rows Read是什么
是指该运算子操作读取的资料笔数,不是指过滤后返回的笔数,
换句话说,和Actual Number of Row完全不同,下图可以明显看出差异
我举一个简单的例子进行执行计画分析
SELECT *
FROM Employee
WHERE NationalIDNumber = 954276278
分析
该查询使用Clustered index scan存取资料,Number of Rows Read资讯明确告诉我们真正读取资料的数量共288笔,
而Actual Number of Rows资讯告诉我们QO过滤后的笔数只有1笔,
我再透过一个简单汇总查询,相信大家更有感觉这属性的价值
select count(*) from Employee
可以看到该汇总查询使用Index Scan存取资料,Number of Rows Read笔数=288,
和上面Clustered index scan一模一样(也就是整个资料表所有资料),
但这里的Actual Number of Rows=288却大不同,因为该查询没有任何过滤条件,
所以QO也会返回整个索引范围的资料(资料流箭头相当粗)。
我们在回到Clustered index scan的查询,我们知道最后的结果集只有一笔资料,
但QO却使用Clustered index scan读取了整个资料表288笔资料,
透过Number of Rows Read属性,我们可以明确知道QO实际读取和返回的资料笔数,
这很明显就是一个效能低落的查询,所以,我们必须改善这查询,如以下执行计画
最后的结果集只有一笔资料,我们当然希望QO透过高效率的索引搜寻快速定位该笔资料即可,
换句话说,Number of Rows Read=1才是我真正想要的,
现在,我想你应该知道这属性所要表达的潜在问题了吧。
PS:更多的执行计画分析和改善,我将在第三部曲决战执行计画,帮大家更了解执行计画