Har*_*war 3 sql-server execution-plan parameter plan-cache
我有一些参数化的查询,但它们每次仍在创建一个新的执行计划。我正在使用 SQL Server 2016。
查询如下:
(@P1 varchar(1043),@P2 varchar(6))
UPDATE table
SET FILEDATA=@P1
WHERE FILEID=@P2
Run Code Online (Sandbox Code Playgroud)
这个查询没有使用缓存中已经生成的执行计划,而是每次都创建一个新计划。
Eri*_*ing 10
@P1所有这些的长度都不同。
您得到不同的计划,因为您没有在代码中明确设置参数长度。
字符串中的任何差异,无论多么微小,都会产生一个新的计划。数据类型大小、空格、注释,所有这些都会在计划缓存中产生新条目。这是说明问题的演示视频。
解决方案是将变量大小声明为与其插入的列的数据类型相同的长度。这将为您提供可预测的计划重用。
执行此操作的方式将根据执行插入的方式而有所不同。如果您使用的是存储过程,则可以更新参数以使用与列相同的长度。如果您使用 .NET 的AddWithValue()方法(这是 evil),请使用允许您设置参数长度的 API 之一。
| 归档时间: |
|
| 查看次数: |
638 次 |
| 最近记录: |