8.2. 关键信息
8.2.2. 警告
查询计划中,可能会看到出现于操作符上的小图标,特别是黄色或红色的感叹号。这些图标都是警告。并非每个警告都指示一个严重问题,但发现时请检查该图标的属性窗口,其将包含该警告图标的具体细节。
8.2.3. 评估与实际数据行数
请记住,查询计划中看到的所有成本都是基于基数评估,而非基于实际数据和执行数,这点非常重要。因此,这些成本也仅限于优化器对基数估计的精度。
深入研究和查看各个操作符成本前,查询计划中查看的第一件事情就是,检查评估和实际数据行数并确信其在合理误差范围内,以进一步确认与评估成本相关的技术评估的精度。有些场景下,会看到一个操作符的评估成本很高,因为优化器评估其将需要处理很多数据,而事实上其将仅需处理很少数据;当评估成本很低时,反之亦然。
如果评估和实际数据行差距明显,则需首先定位原因并修复。仅在此时,才可以查看操作符的成本。
8.2.4. 操作符成本
确认评估基数精确后,就可以开始寻找成本最高的操作符,以将其作为确定初始工作重点的方法。通常,比较同一查询计划中两个操作符的成本是可用的。但是,不能拿不同查询计划中操作符的成本进行比较,因为成本评估基于数学模型,其并未提供这种不同查询计划操作符成本间进行直接对比的能力。
还有,某些操作符没有与其相关的成本,或者说其成本是固定的,这基于优化器内在的、未必精确的假设。例如,Compute Scalar运算符的成本总是非常低且固定,大概是0.0x(零点零几),这在通常情况下是OK的,但偶尔也会产生误导。
所以,虽然成本评估很重要且被采用,但需要注意的是,我们不能盲目将其认作查询计划内精确测量的实际成本。
8.2.5. 数据流
查询计划中的数据流由连接不同操作符的箭头进行定义。这些箭头因其表示操作符间数据的流动而通常被参考为管道。管道的粗细表示实际查询计划中的实际数据量或评估查询计划中的评估数据量。一个粗管道表示正在处理较多数据,而一个细管道表示较少数据被处理。某些场景下,实际查询计划中某些操作符并不报告实际数据行数,因此,采用评估数据行数来设置管道大小。
阅读查询计划时,不仅要查看寻找“粗管道”,而且还需注意管道厚度的突然变化。例如,查询计划中开始很粗的管道到左边突然变得很细,这说明较晚的过滤正在发生。细管道从右至左变得越来越粗,说明查询正在一某种方式大量增加了数据。
8.2.6. 读操作符
这里,我们需要关注的读操作符是扫描和搜寻。扫描操作符(索引扫描或表扫描)只是某种读取索引或表中所有数据页的一个指示器。但是,这种读取经常指示正在读取很多数据行。
搜寻操作符是另一种利用索引结构识别索引页扫描起始点或终止点的一个指示器。搜寻操作符多数场景下指示正在读取少量数据行。
大部分人读取查询计划时都有“扫描糟,搜寻好”的意识。其实,这些操作从定义角度无所谓好坏。查询计划中需要查找的是那些获取有限数据集合(有时指示丢失或性能差的索引)或获取巨量数据集的高成本扫描。
8.2.7. 陌生操作符
阅读查询计划的过程中,当看到从未见过的操作符,或者看到见过也认识但不清楚其为何出现于此的操作符时,我们需要搞清楚这些操作符的概念和具体含义,并理解其在该查询计划中的具体行为及其对执行计划的影响。