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_updatestats
和dbcc 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 management studio执行速度正常