Note that there are some explanatory texts on larger screens.

plurals
  1. PODelete very slow
    primarykey
    data
    text
    <p>I need to delete only the first appear of a record. This have a PK (<code>preld_item, IDENTITY</code>).</p> <p>This is the very slow DELETE..</p> <pre><code>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) &gt; 1) </code></pre> <p>Thanks</p> <p>EDIT:</p> <ul> <li>The table has more than 5 million rows</li> <li><code>id_preliquidacion</code> has a clustered index (pk)</li> </ul> <p>EDIT 2: @vulkanino i think in you answer and i modify the delete...</p> <pre><code>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) &gt; 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 </code></pre> <p>This works best but continue slow</p> <p>EDIT 3: The execution plan of the first delete</p> <pre><code>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) &gt; 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]&gt;(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])) </code></pre>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload