Proc 运行缓慢且 NOT EXISTS

问题描述

我正在尝试创建一个存储过程,但是我遇到了一个问题,即由于接近 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

Table_2 - 该表与 Table_1 具有完全相同的结构,我想要实现的只是将 Table_1 中的数据存档

DECLARE @Date_1 as DATETIME 
SET @Date_1 = GetDate() - 1

INSERT INTO Table_2 (ApptDate,ApptName,ApptDoc,ApptReason)
    SELECT ApptDate,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)

所以这个存储过程看起来很简单,但是 NOT EXIST 导致它非常慢。

NOT EXIST 的原因是这个存储过程是一天运行多次(早上、下午、晚上)的更大进程的一部分。我试图确保我只有一份“03/15/2021”数据的副本。我基本上是在前几天的数据 (@Date_1) 上运行存档过程

任何想法如何“加速”。

解决方法

对于这个查询:

INSERT INTO Table_2 (ApptDate,ApptName,ApptDoc,ApptReason)
    SELECT ApptDate,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_1(ApptType),更重要的是,Table_2(AppType,ApptDate)Table_2(ApptDate,AppType)

注意:我将相关子句更改为仅引用外部查询中的值。这似乎比您的版本更通用,但应该具有相同的性能(在本例中)。