首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >执行存储过程与Sql

问执行存储过程与Sql
EN

Stack Overflow用户
提问于 2020-06-26 16:28:06
回答 2查看 45关注 0票数 0

我有一个奇怪的场景,当我执行一个存储的查询时,查询需要30分钟以上。如果我取存储的proc的主体,并将参数转换为变量,则需要1:30。

我在SSMS中运行这个。

存储的proc使用几个joins执行select。像这样的东西

代码语言:javascript
复制
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执行,为什么两个场景的执行时间会有这么大的差异呢?

EN

回答 2

Stack Overflow用户

发布于 2020-06-26 17:19:15

几乎可以肯定是‘参数嗅探’,这是我通常修复它的方式:

代码语言:javascript
复制
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
票数 2
EN

Stack Overflow用户

发布于 2020-06-26 17:57:54

我最终使用了Larnu在评论中发布的建议:Parameter Sniffing

代码语言:javascript
复制
CREATE PROC [dbo].[DisplayBillingInfo]
...
WITH RECOMPILE
AS 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62590904

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档