我有一个非常基本的删除语句,需要花费非常长的时间来执行
代码如下
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]
知道可能是什么,去哪里寻找吗?
正如@Stu所建议的,当我检查查询计划时(令我羞愧的是我最初省略了),我发现了另一个相关表,该表在相关列上没有索引。
添加后,删除立即生效,正如预期的那样