要删除少量行的 SQL 删除语句需要很长时间

问题描述 投票:0回答:1

我有一个非常基本的删除语句,需要花费非常长的时间来执行

代码如下

select PTRXID
  into __tmpPTRXID
  from PermitsTracked_Requirements_XREF
  where 
    PermitID = @permitID
    and (
        IsAction = 0 
        and (
            IsCompleted = 0
            or IsDenied = 0
        )
    )
--....
;Disable Trigger <...>
-- all triggers disabled

delete from PermitsTracked_Requirements_XREF 
  where 
    PermitID = @permitID
    and PTRXID in (select ptrxid from __tmpPTRXID)
;Enable Trigger <...>

一次最多删除几百条记录,但通常只有几十条。 但这没有任何区别。 该表确实很大,有几千万条记录。 但我在数据库中有其他类似的表,具有类似的删除功能,并且几乎都可以立即工作。

我查了表,没有级联删除关系。 最初确实有,但是我先对相关表进行了删除,最后我把所有的级联删除都删除了,没有效果。

我禁用了所有触发器只是为了确保它们不会影响速度。 同一套上的选择会立即运行。

表上有几个索引(大约10个)但没有进行任何计算。

我创建了一个特定的索引来解决这种情况,如下所示,但它没有帮助

CREATE NONCLUSTERED INDEX [IDX_PermitID_PTRXID] ON [dbo]. 
[PermitsTracked_Requirements_XREF]
(
  [PermitID] ASC,
  [PTRXID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, 
DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, 
OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [Primary]

知道可能是什么,去哪里寻找吗?

sql sql-server query-optimization sql-delete
1个回答
0
投票

正如@Stu所建议的,当我检查查询计划时(令我羞愧的是我最初省略了),我发现了另一个相关表,该表在相关列上没有索引。

添加后,删除立即生效,正如预期的那样

© www.soinside.com 2019 - 2024. All rights reserved.