provare a non eseguire mai il ciclo, lavorare su insiemi di dati.
è possibile inserire, aggiornare, eliminare più righe contemporaneamente. qui in un esempio di più righe:
INSERT INTO YourTable
(col1, col2, col3, col4)
SELECT
cola, colb+Colz, colc, @X
FROM ....
LEFT OUTER JOIN ...
WHERE...
Quando si guarda un ciclo, vedere cosa ha fatto al suo interno. Se sono solo inserimenti/cancelli/aggiornamenti, riscrivi per utilizzare singoli comandi. Se ci sono IF, vedere se questi possono essere dichiarazioni CASE o condizioni WHERE su inserti/cancella/aggiornamenti. In tal caso, rimuovere il loop e utilizzare i comandi set.
Ho preso i loop e li ho sostituiti con i comandi basati su set e ridotto il tempo di esecuzione da pochi minuti a pochi secondi. Ho preso le procedure con molti cicli nidificati e chiamate di procedura e mantenuto i loop (era impossibile usare solo insert/delete/updates), ma ho rimosso il cursore e ho visto meno blocchi/blocchi e massimi incrementi di prestazioni. Qui ci sono due metodi di loop che sono meglio di cicli con i cursori ...
se si deve loop, su un insieme fare qualcosa del genere:
--this looks up each row for every iteration
DECLARE @msg VARCHAR(250)
DECLARE @hostname sysname
--first select of currsor free loop
SELECT @hostname= min(RTRIM(hostname))
FROM master.dbo.sysprocesses (NOLOCK)
WHERE hostname <> ''
WHILE @hostname is not null
BEGIN
set @msg='exec master.dbo.xp_cmdshell "net send '
+ RTRIM(@hostname) + ' '
+ 'testing "'
print @msg
--EXEC (@msg)
--next select of cursor free loop
SELECT @hostname= min(RTRIM(hostname))
FROM master.dbo.sysprocesses (NOLOCK)
WHERE hostname <> ''
and hostname > @hostname
END
se si dispone di una serie ragionevole di articoli (non 100.000) per eseguire un ciclo su di voi può fare questo:
--this will capture each Key to loop over
DECLARE @msg VARCHAR(250)
DECLARE @From int
DECLARE @To int
CREATE TABLE #Rows
(
RowID int not null primary key identity(1,1)
,hostname varchar(100)
)
INSERT INTO #Rows
SELECT DISTINCT hostname
FROM master.dbo.sysprocesses (NOLOCK)
WHERE hostname <> ''
SELECT @From=0,@[email protected]@ROWCOUNT
WHILE @From<@To
BEGIN
SET @[email protected]+1
SELECT @msg='exec master.dbo.xp_cmdshell "net send '
+ RTRIM(hostname) + ' '
+ 'testing "'
FROM #Rows WHERE [email protected]
print @msg
--EXEC (@msg)
END