执行存储过程与sql

vqlkdk9b  于 2021-07-24  发布在  Java
关注(0)|答案(2)|浏览(430)

我有一个奇怪的场景,当我执行一个存储的查询时需要30分钟以上。如果我获取存储过程的主体并将参数转换为变量,则需要1:30。
我在ssms里查这个。
存储过程使用一些连接执行选择。像这样的

  1. CREATE OR ALTER PROCEDURE [report].[MyReport]
  2. @DataPackageId INT,
  3. @DefaultAsOf DATETIME2(7),
  4. @DefaultDealAsOf DATETIME2(7)
  5. AS
  6. SELECT
  7. *
  8. FROM
  9. reporthelper.FuncA(@DataPackageId,@DefaultAsOf, @DefaultDealAsOf) FuncA
  10. LEFT JOIN reporthelper.FuncB(@DataPackageId,@DefaultAsOf, @DefaultDealAsOf) FuncB
  11. ON FuncA.Field1 = FuncB.Field2
  12. AND FuncA.Field1 = FuncB.Field2
  13. --More Joins
  14. GO

如果执行的sql基本相同,为什么这两个场景的执行时间会有这么大的差异?

pzfprimi

pzfprimi1#

几乎可以肯定是“参数嗅探”,我通常是这样解决的:

  1. CREATE OR ALTER PROCEDURE [report].[MyReport]
  2. @DataPackageId INT,
  3. @DefaultAsOf DATETIME2(7),
  4. @DefaultDealAsOf DATETIME2(7)
  5. AS
  6. DECLARE @xDataPackageId INT
  7. DECLARE @xDefaultAsOf DATETIME2(7)
  8. DECLARE @xDefaultDealAsOf DATETIME2(7)
  9. SET @xDataPackageId = @DataPackageId
  10. SET @xDefaultAsOf = @DefaultAsOf
  11. SET @xDefaultDealAsOf =@DefaultDealAsOf
  12. SELECT
  13. *
  14. FROM
  15. reporthelper.FuncA(@xDataPackageId,@DefaultAsOf, @xDefaultDealAsOf) FuncA
  16. LEFT JOIN reporthelper.FuncB(@xDataPackageId,@xDefaultAsOf, @xDefaultDealAsOf) FuncB
  17. ON FuncA.Field1 = FuncB.Field2
  18. AND FuncA.Field1 = FuncB.Field2
  19. --More Joins
展开查看全部
yc0p9oo0

yc0p9oo02#

最后我使用了larnu在评论中发布的建议:参数嗅探

  1. CREATE PROC [dbo].[DisplayBillingInfo]
  2. ...
  3. WITH RECOMPILE
  4. AS

相关问题