2009-04-29 9 views
2

Ich muss einen Wert mit Daten aus mehreren Tabellen berechnen. Ich habe mich gefragt, ob die Verwendung einer gespeicherten Prozedur mit Cursorn einen Leistungsvorteil im Vergleich zum Lesen der Daten in ein Dataset (mit Hilfe einfacher ausgewählter gespeicherter Prozeduren) und zum anschließenden Durchlaufen der Datensätze bietet? Das Dataset ist nicht groß, es besteht aus 6 Tabellen mit jeweils etwa 10 Datensätzen, hauptsächlich GUIDs, mehreren nvarchar (100) -Feldern, einer float-Spalte und einem nvarchar (max).SQL Server - SQL Cursor vs ADO.NET

Antwort

2

, die wahrscheinlich auf den Datensatz abhängen würden Sie werden das Abrufen zurück kann (je größer die Menge, desto logischer es kann innerhalb von SQL Server auszuführen sein, anstatt es um zugeben), aber Ich neige dazu, zu denken, dass, wenn Sie Berechnungen durchführen möchten, dies in Ihrem Code und weg von Ihren gespeicherten Prozeduren geschieht. Wenn Sie Cursor verwenden müssen, um die Daten zusammen zu ziehen, so sei es, aber ich benutze sie, um Berechnungen und andere nicht-retrieval Funktionen zu machen, von denen ich denke, sollte davor abgeschreckt werden.

Bearbeiten: Diese Answer zu einer anderen verwandten Frage wird einige Vor- und Nachteile zu Cursors vs. Schleifen geben. Diese Antwort scheint mit meiner vorherigen Behauptung (siehe oben) über die Skalierung zu kollidieren. Scheint, je mehr Sie erhalten, desto mehr möchten Sie es wahrscheinlich zu Ihrem Code statt in der gespeicherten Prozedur verschieben.

0

Cursor sollten schneller sein (es sei denn, Sie tun etwas seltsam in SQL und nicht in ADO.NET).

Das gesagt, ich habe oft gefunden, dass Cursor mit ein wenig Beinarbeit beseitigt werden können. Wie müssen Sie vorgehen?

Cheers,
Eric

1

Cursor sollte schneller sein, aber wenn Sie viele Benutzer haben, wird es Ihre Server-Ressourcen auffressen. Denken Sie daran, dass Sie beim Schreiben von Schleifen in .Net anstelle von SQL eine leistungsfähigere Programmiersprache haben.

Es gibt sehr wenige Gelegenheiten, bei denen ein Cursor nicht mithilfe von SQL-Standardsätzen ersetzt werden kann. Wenn Sie diese Operation auf dem Server ausführen, können Sie möglicherweise eine Set-basierte Operation verwenden. Noch mehr Details zu dem, was Sie tun?

Wenn Sie sich dafür entscheiden, einen Cursor zu verwenden, beachten Sie, dass ein schreibgeschützter FAST_FORWARD-Cursor Ihnen die beste Leistung bietet, und stellen Sie sicher, dass Sie die Deallocate-Anweisung verwenden. Siehe here für Cursor-Tipps

1

Alternative zu einem Cursor

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<[email protected]) 
begin 


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

end 
Verwandte Themen