今天我想谈下一个非常“简单”的话题:如何阅读执行计划。首先,这个看起来是非常简单的问题,但是当你看看的答案的细节时,它可是令人惊奇的。有2种方式阅读执行计划——从右到左,和从左到右。我们来详细看下,哪个才是正确的……
在SQL Server里,当你开始和执行计划打交道时,你总听到推荐:你应该从右到左阅读执行计划。但是为什么呢?我们看书,杂志,报纸都是从左到右,现在我们阅读执行计划应该从右到左?首先这看起来就不太合理。但当你知道在查询执行期间发生了什么,从右到左的方法就更合理了。
SQL Server内部为查询执行使用所谓的 迭代器模式(Iterator Model) 。在执行计划里每个运算符内部是个C++类,把行传个下一个前面的运算符。因此在执行计划里结果数据流总是从右到左的,如你在下图里看到的。
因此从右到左阅读执行计划非常合理,因为你跟着执行计划的数据流走。我经常告诉人们首先专注下执行计划的右手边,因为那是所有问题的发源地:你通过索引数据结构访问你的数据。如果你看到有在大表上进行扫描操作,你该马上知道你要调整下你的索引设计。
另一个阅读执行计划的方法是从左到右。但从上一部分的你会发现,这个真的不合理,因为执行计划里数据流是从右到左的。那什么情况下从左到右阅读执行计划才合理呢?这个看情况……
我们来仔细看下为什么说这个是看情况。我刚才提过对于执行计划,SQL Server内部使用迭代器模式。每个运算符从右边的运算符请求行,右边的运算符又返回行给左边。因为执行计划物理上还是从左到右执行的。我们来看下面的图片。
在图里第1个运算符从第2个例请求行,第2个从第3个请求行,最后第3个运算符返回行给第2个,地2个运算符返回行给第1个。执行计划物理上是从左到右,数据流是从右到左的。顺便说下,执行计划里有部分是可能从未被执行的(嵌套分区视图),还有在执行计划里,扫描运算符可以被缩短,因此扫描不一定总是扫描。
如果你问别人如何阅读执行计划,那没有错的答案。你可以从右到左读,也可以从左到右读。2个方法都有它们的优缺点。一般我建议从右到左阅读之星计划,因为到时你会跟着逻辑数据流,它会帮助你找到在哪方面因为大量行而有性能问题。
感谢关注!