所以我跑去sp_Blitz
了解一些系统。有一些代码可以像往常一样清理。一些应该是聚集索引的堆。等等
这个特定的查询使用文字,似乎导致了很多计划。在此查询中的表上整理索引和内容,甚至为最新代码/数据库参数化查询以投入生产。
但查询仍然显示为参数化问题。(DBA 帮助将计划缓存查询转换为 SSRS 报告,这样我就可以通过浏览器在 PROD 环境中快速运行它们)。
然后去哪儿?忽略它?(似乎很多计划都很重要)
使用强制参数化?(但是显式参数化的那个出现了)。
呃——我看到开发人员没有接受我的建议,它LEFT JOIN
正在变成一个INNER JOIN
……我必须把它修好……
如果没有强制参数化,所有这些字面风格的查询将永远不会共享相同的计划吗?这个查询对于简单的参数化来说是否太复杂了?
社区维基答案:
如果查询现在是参数化的,您应该能够忽略所有仍然显示常量文字的查询——它们现在在计划缓存中,但随着时间的推移它们会过时。
除了不再是真正的外部连接的外部连接之外,它是
SELECT *
必需的,还是可能有一对更细的索引可以满足实际输出要求(通常是 的某个子集*
)?您还应该鼓励您的开发人员始终使用模式前缀,例如schema.object
.简单参数化只适用于琐碎的计划。
还要考虑针对临时工作负载进行优化。Kimberly Tripp在清理缓存方面有一些很好的指导。将强制参数化视为最后的手段,因为它会影响您的所有查询,并具有很高的性能回归风险。