我需要刪除第一次出現的記錄。這有一個PK(preld_item, IDENTITY
)。刪除非常慢
這是非常緩慢的DELETE ..
DELETE pd
FROM preliquidaciones_deta pd
WHERE pd.preld_item IN (SELECT MAX(p.preld_item)
FROM preliquidaciones_deta p
WHERE p.id_preliquidacion = '216'
GROUP BY p.id_sds_linea_equipo,
p.id_concepto
HAVING COUNT(p.id_sds_linea_equipo) > 1)
感謝
編輯:
- 表已超過500萬行
id_preliquidacion
有一個聚集索引(PK )
編輯2: @vulkanino我想在你的答案和我修改刪除...
DECLARE @loPreldItem INT
DECLARE curItems CURSOR FOR (select max(p.preld_item)
from preliquidaciones_deta p
where p.id_preliquidacion = '216'
group by p.id_sds_linea_equipo, p.id_concepto
having count(p.id_sds_linea_equipo) > 1)
OPEN curItems
FETCH NEXT FROM curItems INTO @loPreldItem
WHILE @@FETCH_STATUS = 0
BEGIN
DELETE FROM preliquidaciones_deta WHERE preld_item = @loPreldItem
FETCH NEXT FROM curItems INTO @loPreldItem
END
CLOSE curItems
DEALLOCATE curItems
這個工作最好的,但繼續緩慢
編輯3:的執行計劃先刪除
delete from preliquidaciones_deta where preld_item in ( select max(preld_item) from preliquidaciones_deta where id_preliquidacion = '216' group by id_sds_linea_equipo, id_concepto, preld_nse, preld_linea having count(id_preliquidacion) > 1)
|--Assert(WHERE:(CASE WHEN NOT [Expr1018] IS NULL THEN (0) ELSE CASE WHEN NOT [Expr1019] IS NULL THEN (1) ELSE NULL END END))
|--Nested Loops(Left Semi Join, OUTER REFERENCES:([data_dealernet_lucom].[dbo].[preliquidaciones_deta].[preld_item]), DEFINE:([Expr1019] = [PROBE VALUE]))
|--Nested Loops(Left Semi Join, OUTER REFERENCES:([data_dealernet_lucom].[dbo].[preliquidaciones_deta].[preld_item]), DEFINE:([Expr1018] = [PROBE VALUE]))
| |--Clustered Index Delete(OBJECT:([data_dealernet_lucom].[dbo].[preliquidaciones_deta].[PK_preliquidaciones_deta]), OBJECT:([data_dealernet_lucom].[dbo].[preliquidaciones_deta].[IX_id_sds]), OBJECT:([data_dealernet_lucom].[dbo].[preliquidaciones_deta].[IX_id_sds_linea_equipo]))
| | |--Top(ROWCOUNT est 0)
| | |--Sort(DISTINCT ORDER BY:([data_dealernet_lucom].[dbo].[preliquidaciones_deta].[preld_item] ASC))
| | |--Nested Loops(Inner Join, OUTER REFERENCES:([Expr1007]) OPTIMIZED)
| | |--Filter(WHERE:([Expr1006]>(1)))
| | | |--Compute Scalar(DEFINE:([Expr1006]=CONVERT_IMPLICIT(int,[Expr1023],0)))
| | | |--Stream Aggregate(GROUP BY:([data_dealernet_lucom].[dbo].[preliquidaciones_deta].[id_sds_linea_equipo], [data_dealernet_lucom].[dbo].[preliquidaciones_deta].[id_concepto], [data_dealernet_lucom].[dbo].[preliquidaciones_deta].[preld_nse], [data_dealernet_lucom].[dbo].[preliquidaciones_deta].[preld_linea]) DEFINE:([Expr1023]=Count(*), [Expr1007]=MAX([data_dealernet_lucom].[dbo].[preliquidaciones_deta].[preld_item])))
| | | |--Sort(ORDER BY:([data_dealernet_lucom].[dbo].[preliquidaciones_deta].[id_sds_linea_equipo] ASC, [data_dealernet_lucom].[dbo].[preliquidaciones_deta].[id_concepto] ASC, [data_dealernet_lucom].[dbo].[preliquidaciones_deta].[preld_nse] ASC, [data_dealernet_lucom].[dbo].[preliquidaciones_deta].[preld_linea] ASC))
| | | |--Clustered Index Scan(OBJECT:([data_dealernet_lucom].[dbo].[preliquidaciones_deta].[PK_preliquidaciones_deta]), WHERE:([data_dealernet_lucom].[dbo].[preliquidaciones_deta].[id_preliquidacion]='216'))
| | |--Clustered Index Seek(OBJECT:([data_dealernet_lucom].[dbo].[preliquidaciones_deta].[PK_preliquidaciones_deta]), SEEK:([data_dealernet_lucom].[dbo].[preliquidaciones_deta].[preld_item]=[Expr1007]) ORDERED FORWARD)
| |--Clustered Index Scan(OBJECT:([data_dealernet_lucom].[dbo].[liquidaciones_deta].[PK_liquidaciones_deta]), WHERE:([data_dealernet_lucom].[dbo].[liquidaciones_deta].[preld_item]=[data_dealernet_lucom].[dbo].[preliquidaciones_deta].[preld_item]))
|--Table Scan(OBJECT:([data_dealernet_lucom].[dbo].[liquidaciones_diferidas]), WHERE:([data_dealernet_lucom].[dbo].[liquidaciones_diferidas].[preld_item]=[data_dealernet_lucom].[dbo].[preliquidaciones_deta].[preld_item]))
如何對任何其他列的contidions出現或者像preld_item,id_sds_linea_equipo,d_concepto這樣的分組標準,他們是否有非聚集索引? – Mithrandir 2012-02-03 13:55:35
是的,他們有一個非聚集索引,沒有這個子查詢也很慢 – Marcos 2012-02-03 14:32:59