最近我们开始使用 sp_BlitzCache 来帮助我们调整查询。我们发现一个 SP 存在一些问题,并且我们能够成功地对其进行重构。
我有一份 sp_BlitzCache 输出的副本,在我们调整查询之前的一周内获取,可在此处获得
https://drive.google.com/open?id=1oiAEl62ZT51qcCEhVzkg8oDA3HB-NCsv
运行生成此输出的命令是
exec sp_BlitzCache @StoredProcName = 'hs_UpdateShipmentPackagesAndWeightSp'
几个问题
1)我注意到同一个计划句柄有多行,这是为什么呢?
2) 你会注意到成本最高的查询 (1451) 有整个 create procedure 语句的查询文本,这是什么意思?此行的指标是否仅用于创建存储过程?
3) 对于上面提到的最高成本行,它的最小/最大授权几乎是 2GB。这是否意味着当我们运行 create procedure 语句时它要求 2gb 的内存?还是在调用 proc 时使用此计划?我想这与问题2的答案有关
4) 为什么在某些情况下我们有 Min/Max grant KB > 0 和 Min/Max used grant kb > 0,但使用的内存授权百分比为 null ?
我们正在运行 SQL Server 2012。
谢谢,凯文
稍微改写你的问题:
问:为什么同一个计划句柄有多个行?
A:因为一个计划可以包含多个语句。
问:为什么一个过程在 sp_BlitzCache 中有多行?
与上面类似:因为存储过程中可以有多个语句。您将看到整个 proc 指标的一行,其中每个语句的一行。
问:当我看到“CREATE PROC”时,这是否意味着 proc 已创建?
不,这就是 SQL Server 在存储过程中存储查询的方式。它向您显示 proc 的内容。
问:为什么授予的内存与使用的内存不同?
因为授权是在查询开始使用内存之前计算的。这有点像你要钱去商店——如果他们在商店里没有你想要的所有东西,你可能不会使用所有的内存。您最终可能只使用了部分资金。