【发布时间】:2021-06-13 19:28:57
【问题描述】:
我正在尝试创建一个存储过程,但是由于接近 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, 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 个“2021 年 3 月 15 日”数据的副本。我基本上是在前几天的数据上运行存档过程(@Date_1)
任何想法如何“加速”。
【问题讨论】:
-
只有
SELECT的时候是不是也很慢? -
@HoneyBadger - 选择不存在只需要 4 秒,但不存在则需要 5 分钟以上
-
@a_horse_with_no_name - SSMS 2016。更新标签
-
SSMS不是数据库,而是 SQL 客户端。但由于它只能与 SQL Server 一起使用,因此可以安全地假设您正在使用 SQL Server。 -
你肯定需要至少在
Table_2 (AppType, ApptDate)上的索引,最好是Table_1。万圣节保护可能会减慢它的速度,所以不妨试试MERGE... WHEN NOT MATCHED THEN INSERT...,请参阅Paul White
标签: tsql stored-procedures sql-server-2016 exists