Tsql Proc运行缓慢,但不存在

Tsql 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

我正在尝试创建一个存储过程,但是我遇到了一个问题,由于接近50k条记录,该存储过程运行了5分钟以上

这个过程似乎很简单,我只是不知道为什么要花这么长时间

基本上我有两张桌子:

表1

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 . . . 老实说,如果只有少数应用程序类型,那么索引就没那么有用了。