【问题标题】:Proc is running slow with NOT EXISTSProc 运行缓慢,不存在
【发布时间】: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


【解决方案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)

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

【讨论】:

  • 我真的很想避免向 Table_1 添加索引。也许我只是将所有数据插入到#Temp 表中,并为其添加索引
  • 在 Table_2 上添加了一个索引 - proc 在 10 秒内运行。谢谢
  • @Koosh 。 . .老实说,如果您只有少数ApptTypes,那么索引就没那么有用了。
猜你喜欢
  • 1970-01-01
  • 2015-03-11
  • 1970-01-01
  • 1970-01-01
  • 2021-11-25
  • 2020-07-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多