2015-05-14 10 views
5

ho avuto la necessità di rinumerare le righe in una tabella utilizzando il codice da un You've Been Haacked blog post:incremento automatico nella dichiarazione di aggiornamento con conseguente valori duplicati sul grande tavolo

DECLARE @counter int 
SET @counter = 0 
UPDATE #myTable 
SET @counter = ID = @counter + 1 

Questo funziona bene con alcuni record di diverse migliaia , ma quando lo eseguo su un'istanza di SQL Server 2012 (64-bit) su una tabella con record di 250K +, finisco con molti duplicati (l'ID # 1 appare 12 volte). In tutto, ci sono circa 27.000 record con valori duplicati. La cosa strana è che circa 19K hanno esattamente 12 duplicati (lo stesso numero di processori sulla mia macchina).

Qual è la causa dei duplicati?

+1

Direi che questa istruzione viene eseguita in parallelo, non riga per riga. E quindi il contatore non viene incrementato "abbastanza velocemente"., –

+0

Puoi pubblicare il tuo piano di query? – dsolimano

+1

Questo non è il modo migliore per farlo. ROW_NUMBER sarebbe un approccio molto migliore come già detto da @GiorgiNakeuri. È possibile aggiungere il suggerimento query OPTION (MAXDOP 1) per evitare che si riversino su più di un processore. Tuttavia, è probabile che la performance ne risenta. –

risposta

5

Non è garantito il funzionamento che sono sicuro che Phil Haack inviti. Getta via questo codice

La ragione probabile è il parallelismo. Quella variabile potrebbe essere martellata su più thread.

La cosa strana è che circa 19 K hanno esattamente 12 duplicati (lo stesso numero di processori sulla mia macchina).

Questo corrisponde alla spiegazione.

Usa ROW_NUMBER per generare buona garantito per funzionare ID:

update t 
set ID = r 
from (
select *, row_number() over (order by something) r from T 
) t 

altrettanto semplice ma sano di mente.

Problemi correlati