Problema con update massivo

giovedì 09 aprile 2009 - 17.45

Epros Profilo | Newbie

Salve a tutti,

ho una tabella con righe duplicate e in alcuni casi triplicate, devo mantenere una di queste (quella con valore 'Indefinito') aggiornandola, e cancellare l'altra (o le altre 2).

Ho provato con una tabella temporanea in questo modo:

CREATE TABLE #tmp_ImportedData_GenericData
(
Id int identity(1,1),
tmpCode varchar(255) NULL,
tmpAlpha3Code varchar(50) NULL,
tmpRelatedYear int NOT NULL,
tmpPreviousValue varchar(255) NULL,
tmpGrowthRate varchar(255) NULL
)



INSERT INTO #tmp_ImportedData_GenericData
SELECT
MCS_ImportedData_GenericData.Code,
MCS_ImportedData_GenericData.Alpha3Code,
MCS_ImportedData_GenericData.RelatedYear,
MCS_ImportedData_GenericData.PreviousValue,
MCS_ImportedData_GenericData.GrowthRate
FROM MCS_ImportedData_GenericData
INNER JOIN
(
SELECT CODE, ALPHA3CODE, RELATEDYEAR, COUNT(*) AS NUMROWS
FROM MCS_ImportedData_GenericData AS M
GROUP BY M.CODE, M.ALPHA3CODE, M.RELATEDYEAR
HAVING count(*) > 1
) AS M2 ON MCS_ImportedData_GenericData.CODE = M2.CODE
AND MCS_ImportedData_GenericData.ALPHA3CODE = M2.ALPHA3CODE
AND MCS_ImportedData_GenericData.RELATEDYEAR = M2.RELATEDYEAR
WHERE
(MCS_ImportedData_GenericData.PreviousValue <> 'INDEFINITO')

DECLARE @contatore int
DECLARE @totalerighe int

SET @contatore = 1

SELECT @totalerighe = count(*) from #tmp_ImportedData_GenericData
-- PRINT @totaleRighe

WHILE @contatore < @totalerighe
BEGIN
SELECT
@Code = tmpCode,
@Alpha3Code = tmpAlpha3Code,
@RelatedYear = tmpRelatedYear,
@OldValue = tmpPreviousValue,
@GrowthRate = tmpGrowthRate
FROM
#tmp_ImportedData_GenericData
WHERE
Id = @contatore

DELETE FROM MCS_ImportedData_GenericData
WHERE
Code = @Code
AND Alpha3Code = @Alpha3Code
AND RelatedYear = @RelatedYear
AND PreviousValue <> 'INDEFINITO' OR PreviousValue IS NULL

UPDATE
MCS_ImportedData_GenericData
SET
PreviousValue = @OldValue, GrowthRate = @GrowthRate
WHERE
Code = @Code
AND Alpha3Code = @Alpha3Code
AND RelatedYear = @RelatedYear
AND MCS_ImportedData_GenericData.PreviousValue ='INDEFINITO'

SET @contatore = @contatore + 1
END
PRINT @contatore
DROP TABLE #tmp_ImportedData_GenericData


ma impiega delle ore anche solo per elaborare qualche decina di migliaia di righe, qualcuno sa dirmi come ottimizzare (o riscrivere) il codide per migliorare le performance?

Grazie

alx_81 Profilo | Guru

>Salve a tutti,
Ciao!

>ma impiega delle ore anche solo per elaborare qualche decina
>di migliaia di righe, qualcuno sa dirmi come ottimizzare (o riscrivere)
>il codide per migliorare le performance?
Evita di fare il ciclo e concentrati su una DELETE FROM JOIN e una UPDATE FROM JOIN.
Studia la SELECT che ricava i dati da cancellare (tutti) e gli stessi criteri usali per la DELETE. Lo stesso devi fare per la UPDATE.
La sintassi è:
DELETE FROM T1 FROM Tabella1 AS T1 JOIN Tabella2 AS T2 ON <criterio> WHERE <condizione>

lo stesso vale per la UPDATE:

UPDATE T1 SET <campo> = <valore|campo altra tabella> FROM Tabella1 AS T1 JOIN Tabella2 AS T2 ON <criterio> WHERE <condizione>

I cicli non sono cose da far fare a SQL Server
Inoltre, per migliorare le performance, potresti vedere che piani di esecuzione ti vengono generati e, in caso di necessità, quali indici creare.

>Grazie
di nulla!
--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5