我使用linq来调用c#中的这个存储过程,并且通常需要大约1ms来运行,但每几百次调用中一次最终需要10-60秒。我认为这是一个参数嗅探问题所以我使用本地@_BuyerID来避免这种情况。我也尝试过添加“重新编译”选项'到最后,优化未知,没有运气。
ALTER PROCEDURE [dbo].[GetBuyerAddresses]
@BuyerID INT
AS
DECLARE @_BuyerID INT
SET @_BuyerID = @BuyerID
SELECT
Addresses.AddressID
FROM dbo.Buyers
JOIN dbo.Addresses ON Buyers.BuyerID = Addresses.BuyerID
WHERE Buyers.BuyerID = @_BuyerID
我现在不确定在哪里集中我的搜索,参数嗅探似乎是缓慢存储过程最常见的问题,但这些解决方案似乎都不适用于我。
答案 0 :(得分:0)
看起来你可以优化你的语句,以避免对Buyers表进行不必要的读取,并消除冗余的@_BuyerID。
这是我如何编写proc:
ALTER PROCEDURE [dbo].[GetBuyerAddresses]
@BuyerID INT
AS
SELECT AddressID
FROM dbo.Addresses
WHERE BuyerID = @BuyerID
第2部分:
考虑启用"异步自动更新统计信息"在这个数据库上。可能是Addresses表在查询之间发生了足够的变化,统计信息被认为是过时的,并且在缓慢响应的查询期间正在同步更新。在这种情况下,此设置将有所帮助。