我有一个删除查询,它选择超过7天的每个条目都会超出第一个条目。
这意味着,此刻:我找到每一行,按4个给定值分组,其中包含超过1个值并记住时间戳的最高日期 - 然后将其连接到自身以找出其中的ID删除它们。
加入到自身是巨大的,非常耗时。 在我的所有数据中,这个删除reuqest需要大约30分钟才能完成,即使在之前发生索引魔法并且每天都完成...
你可以帮助我加快速度吗?
DELETE FROM [D_PROJEKTE].[dbo].[T_PROTOKOLLE]
WHERE f_index in
(
SELECT tab2.f_index FROM
(SELECT PROT1.F_ID, PROT1.[F_GERAETE_ADR], PROT1.[F_OBJNR],
PROT1.[F_SI] , max(f_datum) as MAXDATE, count(*) as OCCURES
FROM [D_PROJEKTE].[dbo].[T_PROTOKOLLE] PROT1
WHERE PROT1.f_datum < dateadd(day, -7, GETDATE())
and f_id = 9998 -- was älter als 7 Tage, drüber wird nicht gelöscht
GROUP BY PROT1.[F_ID]
,PROT1.[F_GERAETE_ADR]
,PROT1.[F_OBJNR]
,PROT1.[F_SI]
HAVING count(*) > 1 -- was nur einmal vorkommt wird nicht gelöscht
) tab1
join
(SELECT
F_INDEX, F_ID, F_GERAETE_ADR, F_OBJNR, F_SI, F_DATUM
FROM
[D_PROJEKTE].[dbo].[T_PROTOKOLLE]
WHERE
f_id = 9998) tab2 ON tab1.F_ID = tab2.F_ID
AND tab1.F_GERAETE_ADR = tab2.F_GERAETE_ADR
AND tab1.F_OBJNR = tab2.F_OBJNR
AND tab1.F_SI = tab2.F_SI
AND tab2.f_datum < tab1.MAXDATE)
答案 0 :(得分:3)
;WITH X AS
(
SELECT *
, ROW_NUMBER() OVER (PARTITION BY
F_ID
, [F_GERAETE_ADR]
, [F_OBJNR]
, [F_SI] ORDER BY f_datum DESC) as rn
FROM [D_PROJEKTE].[dbo].[T_PROTOKOLLE]
WHERE f_datum < dateadd(day, -7, GETDATE())
)
DELETE FROM X where rn > 1