我有一个奇怪的场景,当我执行一个存储的查询时,查询需要30分钟以上。如果我取存储的proc的主体,并将参数转换为变量,则需要1:30。
我在SSMS中运行这个。
存储的proc使用几个joins执行select。像这样的东西
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执行,为什么两个场景的执行时间会有这么大的差异呢?
发布于 2020-06-26 17:19:15
几乎可以肯定是‘参数嗅探’,这是我通常修复它的方式:
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发布于 2020-06-26 17:57:54
我最终使用了Larnu在评论中发布的建议:Parameter Sniffing
CREATE PROC [dbo].[DisplayBillingInfo]
...
WITH RECOMPILE
AS https://stackoverflow.com/questions/62590904
复制相似问题