存储过程查询计划具有不同的参数类型

时间:2017-03-09 11:02:55

标签: sql .net data-access-layer sql-execution-plan petapoco

我正在使用PetaPoco数据访问层 因此,在传递所有值时调用存储过程 我在SQL profiler中得到了这个

exec sp_executesql N'EXEC dbo.[sp_GetProducts] @0 , @1',N'@0 int,@1 int',@0=316,@1=5

但是当传递NULL时,类型没有确定,它默认为nvarchar(4000),就像工作正常

exec sp_executesql N'EXEC dbo.[sp_GetProducts] @0 , @1',N'@0 int,@1 nvarchar(4000)',@0=316,NULL

我的问题是关于性能,我们是否会失去性能,因为相同的存储过程有2个查询计划?或两个电话都使用相同的计划?

谢谢

1 个答案:

答案 0 :(得分:1)

是的,可能存在性能差异。由于您传递的是不同的参数集,因此可能无法使用相同的计划。这与Parameter Sniffing的概念有关。

  

如果SQL查询具有参数,则SQL Server会创建执行计划   通过一个名为的过程为他们量身定制,以提高性能   '参数嗅探'。该计划存储并重复使用   通常是最好的执行计划。偶尔,它不是,而你   然后可以遇到性能问题

有几种方法可以解决这个问题,这些方法在我提供的链接中突出显示。请参阅如何处理参数嗅探部分。可能的选项是在存储过程中使用With Recompile选项,或者通过更改存储过程中参数值的使用方式来禁用参数嗅探,或者创建多个存储过程。