执行存储过程与sql

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

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

CREATE OR ALTER PROCEDURE [report].[MyReport]
    @DataPackageId INT, 
    @DefaultAsOf DATETIME2(7),
    @DefaultDealAsOf DATETIME2(7)

AS
    SELECT 

         *

    FROM
        reporthelper.FuncA(@DataPackageId,@DefaultAsOf, @DefaultDealAsOf) FuncA
    LEFT JOIN reporthelper.FuncB(@DataPackageId,@DefaultAsOf, @DefaultDealAsOf) FuncB
        ON FuncA.Field1 = FuncB.Field2
        AND FuncA.Field1 = FuncB.Field2
    --More Joins
GO

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

pzfprimi

pzfprimi1#

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

CREATE OR ALTER PROCEDURE [report].[MyReport]
    @DataPackageId INT, 
    @DefaultAsOf DATETIME2(7),
    @DefaultDealAsOf DATETIME2(7)

AS
    DECLARE @xDataPackageId INT
    DECLARE @xDefaultAsOf DATETIME2(7)
    DECLARE @xDefaultDealAsOf DATETIME2(7)

    SET @xDataPackageId = @DataPackageId
    SET @xDefaultAsOf = @DefaultAsOf
    SET @xDefaultDealAsOf =@DefaultDealAsOf

    SELECT 

         *

    FROM
        reporthelper.FuncA(@xDataPackageId,@DefaultAsOf, @xDefaultDealAsOf) FuncA
    LEFT JOIN reporthelper.FuncB(@xDataPackageId,@xDefaultAsOf, @xDefaultDealAsOf) FuncB
        ON FuncA.Field1 = FuncB.Field2
        AND FuncA.Field1 = FuncB.Field2
    --More Joins
yc0p9oo0

yc0p9oo02#

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

CREATE PROC [dbo].[DisplayBillingInfo]
...
WITH RECOMPILE
AS

相关问题