SQL Server 存储过程在第一次运行时需要很长时间

Posted

技术标签:

【中文标题】SQL Server 存储过程在第一次运行时需要很长时间【英文标题】:SQL Server stored procedure taking a very long time on first run 【发布时间】:2022-01-13 14:08:47 【问题描述】:

我在用于租赁协议的 c# 程序中遇到超时错误问题。同样的程序已经工作了多年,但随着时间的推移正在放缓。我现在在尝试运行存储过程时在软件中遇到超时错误。我已经确定它是基于服务器而不是基于代码的,因为在 SSMS 中运行相同的 UPDATE 语句会导致它具有相同的停机时间。

一些简单的细节

在第一次或第二次运行语句后问题自行解决。 该表仅包含 210k 行。 它是在 Windows Server 2012 上运行的 SQL Server 2016 Express 数据库。 我将附上 1:42 的声明截图。

存储过程如下:

 @SaleNumber bigint,
 @GuestNumber bigint,
 @PassNumber bigint,
 @FirstName nvarchar(50),
 @LastName nvarchar(50),
 @Zip nvarchar(50),
 @Email nvarchar(50),
 @Address nvarchar(50),
 @City nvarchar(50),
 @State nvarchar(50),
 @LiabilityChecked bit,
 @LiabilityID uniqueidentifier,
 @AcceptEmail bit,
 @Phone1 varchar(50)
AS

UPDATE Orders
SET FirstName = @FirstName, 
    LastName = @LastName, 
    Zip = @Zip, 
    Email = @Email, 
    Address1 = @Address, 
    City = @City, 
    State = @State, 
    LiabilityChecked = @LiabilityChecked, 
    LiabilityID = @LiabilityID, 
    AcceptEmail = @AcceptEmail, 
    Phone1 = @Phone1
WHERE  
    Sale_no = @SaleNumber 
    AND Pass_no = @PassNumber 
    AND Guest_no = @GuestNumber

我尝试了以下方法:

删除实体框架并对过程进行硬编码。 (我现在认为是 SQL 服务器问题)

即使服务器的使用率始终低于 40%,也会增加服务器的资源。

创建新的 Azure 服务器(非 express)并移动数据库。

WHERE 子句更改为:

  DateRedeemed >= DATEADD(day, -1, GETDATE()) 
  AND Sale_no = @SaleNumber

我这样做是因为认为日期窗口会更有效。我不想将其作为解决方案,因为这会引发其他编码问题。

已验证没有其他程序正在锁定记录。

exec sp_updatestatsdbcc freeproccache

编辑 1: 我正在研究索引。对不起,我是一个软件人,很少做数据库。我在学习! 至于

除非有其他东西在表上锁定,否则基于不给定销售的更新不会超过毫秒。

我知道这一点,因为一旦在 azure 上创建了新数据库,我就从 SSMS 运行了 select 语句,而没有指向它。所以我是唯一的电话。

我将在下面包含执行计划:

【问题讨论】:

尝试运行此查询并共享执行计划,通过这样做您可能会找到查询为何需要这么长时间的线索(可能您缺少一些索引)。 让我猜猜 - 有人需要了解索引是什么。 “但随着时间的推移正在放缓。” - 就像明显的线索。数据越多,速度越慢(可测量),因为表扫描需要更长的时间。 use-the-index-luke.com - 除非有其他东西在桌子上锁定,否则基于未给定销售的更新不会超过毫秒。 请通过brentozar.com/pastetheplan提供查询计划 我建议在您的 Sale_no 列上添加一个索引,这有助于 SQL Server 更快地找到要更新的行。如果没有该索引,它每次都必须搜索整个 210k 行。 【参考方案1】:

执行计划告诉您需要composite index 来优化该查询:

CREATE NONCLUSTERED INDEX IX_Orders_SalePassGuest ON 
       Orders (Sale_no, Pass_no, Guest_no)

【讨论】:

以上是关于SQL Server 存储过程在第一次运行时需要很长时间的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 索引重新创建存储过程慢

SQL Server存储过程的初步认知

慢速存储过程 - SQL Server

存储过程被程序和第三方客户端执行很慢,而sql server management studio执行速度正常

SQL Server 存储过程在 SSMS 中运行速度很快,在应用程序中运行速度很慢 [重复]

在 ASP.NET MVC 中执行 SQL Server 存储过程时如何防止超时错误?