Tsql Proc运行缓慢,但不存在
我正在尝试创建一个存储过程,但是我遇到了一个问题,由于接近50k条记录,该存储过程运行了5分钟以上 这个过程似乎很简单,我只是不知道为什么要花这么长时间 基本上我有两张桌子: 表1Tsql Proc运行缓慢,但不存在,tsql,stored-procedures,sql-server-2016,exists,Tsql,Stored Procedures,Sql Server 2016,Exists,我正在尝试创建一个存储过程,但是我遇到了一个问题,由于接近50k条记录,该存储过程运行了5分钟以上 这个过程似乎很简单,我只是不知道为什么要花这么长时间 基本上我有两张桌子: 表1 ApptDate ApptName ApptDoc ApptReason ApptType ----------------------------------------------------------------------- 03/15/2021 Ph
ApptDate ApptName ApptDoc ApptReason ApptType
-----------------------------------------------------------------------
03/15/2021 Physical Dr Smith Yearly Day
03/15/2021 Check In Dr Doe Check In Day
03/15/2021 Appt oth Dr Dee Check In Monthly
表2-此表与表1具有相同的精确结构,我试图实现的只是将表1中的数据存档
DECLARE @Date_1 as DATETIME
SET @Date_1 = GetDate() - 1
INSERT INTO Table_2 (ApptDate, ApptName, ApptDoc, ApptReason)
SELECT ApptDate, ApptName, ApptDoc, ApptReason
FROM Table_1
WHERE ApptType = 'Day' AND ApptDate = @Date_1
AND NOT EXISTS (SELECT 1 FROM Table_2
WHERE AppType = 'Day' AND ApptDate = @Date_1)
因此,这个存储过程看起来非常简单,但是不存在导致它非常慢
之所以不存在,是因为此存储过程是一个更大进程的一部分,该进程每天早上、下午、晚上运行多次。我正在努力确保我只有一份“03/15/2021”数据的副本。我基本上是在前几天的数据@Date\u 1上运行一个归档过程
您对如何加快此速度有何想法。对于此查询:
INSERT INTO Table_2 (ApptDate, ApptName, ApptDoc, ApptReason)
SELECT ApptDate, ApptName, ApptDoc, ApptReason
from Table_1 t1
Where ApptType = 'Day' and
ApptDate = @Date_1 and
NOT EXISTS (Select 1
from Table_2 t2
where t2.AppType = t1.AppType and
t2.ApptDate = t1.ApptDate
);
您需要索引:table_1ApptType,更重要的是,table_2AppType,ApptDate或table_2ApptDate,AppType
注意:我将correlation子句更改为仅引用外部查询中的值。这似乎比您的版本更通用,但在这种情况下应具有相同的性能。仅选择时是否也会变慢?@HoneyBadger-选择不存在只需4秒,选择不存在则需要5秒以上minutes@a_horse_with_no_name-2016年SSMS。更新的标记SMS不是数据库,而是SQL客户端。但由于它只能与SQL Server一起使用,所以可以安全地假设您正在使用SQL Server。您肯定需要至少在表2 AppType、ApptDate(最好是表1)上建立索引。万圣节保护可能会减慢速度,所以也许可以尝试合并。。。如果不匹配,则插入。。。看到了吗?我真的不想在表1中添加索引。也许我只需要将所有数据插入一个临时表中,并向临时表中添加索引。在表2上添加一个索引,proc在10秒内运行。Thanks@Koosh . . . 老实说,如果只有少数应用程序类型,那么索引就没那么有用了。