kev*_*hat 2 sql-server execution-plan sql-server-2012 sp-blitzcache
最近我们开始使用 sp_BlitzCache 来帮助我们调整我们的查询。我们发现一个 SP 有一些问题,我们能够成功地重构它。
在我们调整查询之前的一周内,我有一份 sp_BlitzCache 的输出副本,可在此处获得
https://drive.google.com/open?id=1oiAEl62ZT51qcCEhVzkg8oDA3HB-NCsv
生成此输出的命令运行是
exec sp_BlitzCache @StoredProcName = 'hs_UpdateShipmentPackagesAndWeightSp'
Run Code Online (Sandbox Code Playgroud)
几个问题
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。
谢谢,凯文
稍微改写一下你的问题:
问:为什么同一个计划句柄有多个行?
答:因为一个计划可以包含多个语句。
问:为什么一个 proc 在 sp_BlitzCache 中有多行?
与上面类似:因为存储过程中可以有多个语句。您将看到一行表示整个 proc 的指标,以及一行表示其中的每个语句。
问:当我看到“CREATE PROC”时,是否表示该 proc 已创建?
不,这就是 SQL Server 在存储过程中存储查询的方式。它向您展示了 proc 的内容。
问:为什么授予的内存与使用的内存不同?
因为授权是在查询开始使用内存之前计算的。这有点像你去商店要钱——如果商店里没有你想要的所有东西,你可能不会使用所有的内存。您最终可能只使用了部分资金。