Frage

Ich habe einen Wert zu berechnen, Daten aus mehreren Tabellen beteiligt ist. Ich frage mich, ob eine gespeicherte Prozedur mit Cursor verwenden würde, die Daten in einen Datensatz einen Leistungsvorteil bietet im Vergleich zu lesen (mit einfachem wählen Stored Procedures) und dann durch die Datensätze Looping? Der Datensatz ist nicht groß, es in 6 Tabellen besteht, die jeweils mit etwa 10 Aufzeichnungen, hauptsächlich GUIDs, mehrere nvarchar (100) Felder, eine Schwimmersäule und eine nvarchar (max).

War es hilfreich?

Lösung

Das wäre hängt wahrscheinlich von dem Datensatz Sie können Abrufen zurück (je größer die Menge, desto logischer es sein, innerhalb von SQL Server, anstatt es um zugeben ausführen kann), aber ich neige dazu zu denken, dass, wenn Sie schauen, um Berechnungen durchzuführen, tun sie es in Ihrem Code und weg von Ihren gespeicherten Prozeduren. Wenn Sie Cursor verwenden, um die Daten zusammen zu ziehen, so sei es, aber sie mit Berechnungen zu tun und andere nicht-Abruffunktionen Ich denke gescheut werden sollte weg.

Bearbeiten : Das Antwort auf eine andere Frage im Zusammenhang werden einige Vor-und Nachteile geben vs. Looping-Cursor. Diese Antwort scheint mit meiner früheren Behauptung (lesen Sie oben) über die Skalierung in Konflikt stehen. Scheint darauf hinzudeuten, dass je größer man wird, desto mehr werden Sie wahrscheinlich, um Ihren Code bewegen wollen weg, anstatt in der gespeicherten Prozedur.

Andere Tipps

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<=@count)
begin


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

end

Cursor sollte schneller sein, aber wenn Sie viele Benutzer haben laufen diese es dem Server Ressourcen auffressen. Denken Sie daran, haben Sie eine leistungsfähigere Kodierung Sprache, wenn Schleifen in .Net statt SQL geschrieben werden.

Es gibt nur wenige Fälle, in denen ein Cursor nicht mit Standardsatz basierte SQL ersetzt werden kann. Wenn Sie diesen Vorgang auf dem Server tun können Sie in der Lage sein, einen Satz basierten Betrieb zu verwenden. Noch weitere Details darüber, was Sie tun?

Wenn Sie sich entscheiden, einen Cursor zu beachten, zu verwenden, dass ein FAST_FORWARD nur Cursor lesen geben Ihnen die beste Leistung, und stellen Sie sicher, dass Sie die ausplanen Anweisung verwenden, es zu veröffentlichen. Siehe hier für Cursor-Tipps

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

Das heißt, habe ich oft festgestellt, dass Cursor mit einem wenig Beinarbeit beseitigt werden kann. Was ist das Verfahren, das Sie tun müssen?

Cheers,
Eric

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top