【问题标题】:Stored procedure query plans with different parameter types不同参数类型的存储过程查询计划
【发布时间】:2017-07-30 08:06:12
【问题描述】:

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

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 个查询计划而失去性能?或者两个电话都使用相同的计划?

谢谢

【问题讨论】:

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


    【解决方案1】:

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

    如果 SQL 查询有参数,SQL Server 会创建一个执行计划 通过一个名为 '参数嗅探'。该计划被存储和重复使用,因为它是 通常是最好的执行计划。只是偶尔,它不是,而你 然后可能会遇到性能问题

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-17
      • 2010-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多