Select 删除第一个条目以外的所有条目
Select to delete every entry other then the first one
我有一个删除查询,它选择除第一个条目之外超过 7 天的每个条目。
这意味着,目前:我找到每一行,按 4 个给定值分组,其中有超过 1 个值并记住时间戳的最高日期 - 然后将其连接到自身以找出删除它们。
与自身的连接非常庞大且非常耗时。
在我所有的数据上,这个删除 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)
;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
我有一个删除查询,它选择除第一个条目之外超过 7 天的每个条目。
这意味着,目前:我找到每一行,按 4 个给定值分组,其中有超过 1 个值并记住时间戳的最高日期 - 然后将其连接到自身以找出删除它们。
与自身的连接非常庞大且非常耗时。 在我所有的数据上,这个删除 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)
;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