Proc 运行 慢,NOT EXISTS
Proc is running slow with NOT EXISTS
我正在尝试创建一个存储过程,但是我 运行 遇到了一个问题,即由于接近 50k 条记录,存储过程运行超过 5 分钟。
这个过程看起来很简单,我只是不确定为什么要花这么长时间。
基本上我有两个 tables:
Table_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 与 Table_1 具有完全相同的结构,我想要实现的只是存档来自 Table_1[=13 的数据=]
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)
所以这个存储过程看起来很简单,但是 NOT EXIST 导致它真的很慢。
NOT EXIST 的原因是此存储过程是一天运行多次(早上、下午、晚上)的更大进程的一部分。我试图确保我只有 1 个“03/15/2021”数据副本。我基本上是 运行 前几天数据的归档过程 (@Date_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_1(ApptType)
,更重要的是,Table_2(AppType, ApptDate)
或 Table_2(ApptDate, AppType)
。
注意:我将关联子句更改为仅引用外部查询中的值。这似乎比您的版本更通用,但应该具有相同的性能(在本例中)。
我正在尝试创建一个存储过程,但是我 运行 遇到了一个问题,即由于接近 50k 条记录,存储过程运行超过 5 分钟。
这个过程看起来很简单,我只是不确定为什么要花这么长时间。
基本上我有两个 tables:
Table_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 与 Table_1 具有完全相同的结构,我想要实现的只是存档来自 Table_1[=13 的数据=]
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)
所以这个存储过程看起来很简单,但是 NOT EXIST 导致它真的很慢。
NOT EXIST 的原因是此存储过程是一天运行多次(早上、下午、晚上)的更大进程的一部分。我试图确保我只有 1 个“03/15/2021”数据副本。我基本上是 运行 前几天数据的归档过程 (@Date_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_1(ApptType)
,更重要的是,Table_2(AppType, ApptDate)
或 Table_2(ApptDate, AppType)
。
注意:我将关联子句更改为仅引用外部查询中的值。这似乎比您的版本更通用,但应该具有相同的性能(在本例中)。