我正在使用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个查询计划?或两个电话都使用相同的计划?
谢谢
答案 0 :(得分:1)
是的,可能存在性能差异。由于您传递的是不同的参数集,因此可能无法使用相同的计划。这与Parameter Sniffing的概念有关。
如果SQL查询具有参数,则SQL Server会创建执行计划 通过一个名为的过程为他们量身定制,以提高性能 '参数嗅探'。该计划存储并重复使用 通常是最好的执行计划。偶尔,它不是,而你 然后可以遇到性能问题
有几种方法可以解决这个问题,这些方法在我提供的链接中突出显示。请参阅如何处理参数嗅探部分。可能的选项是在存储过程中使用With Recompile选项,或者通过更改存储过程中参数值的使用方式来禁用参数嗅探,或者创建多个存储过程。