问题描述
我正在尝试创建一个存储过程,但是我遇到了一个问题,即由于接近 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)
。
注意:我将相关子句更改为仅引用外部查询中的值。这似乎比您的版本更通用,但应该具有相同的性能(在本例中)。