Domanda

Devo calcolare un valore che coinvolge dati da più tabelle. Mi chiedevo se l'uso di una procedura memorizzata con i cursori avrebbe offerto un vantaggio in termini di prestazioni rispetto alla lettura dei dati in un set di dati (utilizzando semplici procedure memorizzate selezionate) e quindi il ciclo attraverso i record? Il set di dati non è grande, è composto da 6 tabelle, ciascuna con circa 10 record, principalmente GUID, diversi campi nvarchar (100), una colonna float e un nvarchar (max).

È stato utile?

Soluzione

Probabilmente ciò dipenderebbe dal set di dati che potresti recuperare (più grande è il set, più logico potrebbe essere eseguire all'interno di SQL Server invece di passarlo in giro), ma tendo a pensare che se stai cercando di eseguire calcoli, farlo nel codice e lontano dalle procedure memorizzate. Se hai bisogno di usare i cursori per mettere insieme i dati, così sia, ma usandoli per fare calcoli e altre funzioni di non recupero penso che dovrei essere evitato.

Modifica : questo Rispondi a un'altra domanda correlata fornirà alcuni vantaggi e svantaggi ai cursori rispetto al looping. Questa risposta sembrerebbe in conflitto con la mia precedente affermazione (leggi sopra) sul ridimensionamento. Sembra suggerire che più grande ottieni, più probabilmente vorrai spostarlo sul tuo codice anziché nella procedura memorizzata.

Altri suggerimenti

alternativa a un cursore

declare @table table (Fields int)
declare @count int
declare @i

insert inot @table (Fields)
select Fields
from Table


select @count = count(*) from @table

while (@i<=@count)
begin


--whatever you need to do
set @i = @i + 1

end

I cursori dovrebbero essere più veloci, ma se hai molti utenti che lo eseguono, consumeranno le risorse del tuo server. Ricorda che hai un linguaggio di codifica più potente quando scrivi loop in .Net anziché SQL.

Ci sono pochissime occasioni in cui un cursore non può essere sostituito usando SQL basato su set standard. Se si sta eseguendo questa operazione sul server, è possibile utilizzare un'operazione basata su set. Ulteriori dettagli su cosa stai facendo?

Se decidi di utilizzare un cursore, tieni presente che un cursore di sola lettura FAST_FORWARD ti darà le migliori prestazioni e assicurati di utilizzare l'istruzione deallocate per rilasciarlo. Vedi qui per suggerimenti sul cursore

I cursori dovrebbero essere più veloci (a meno che tu non stia facendo qualcosa di strano in SQL e non in ADO.NET).

Detto questo, ho spesso scoperto che i cursori possono essere eliminati con un po 'di legwork. Qual è la procedura che devi fare?

Saluti,
Eric

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top