Question

Je dois calculer une valeur impliquant des données de plusieurs tables. Je me demandais si l'utilisation d'une procédure stockée avec des curseurs offrirait un avantage en termes de performances par rapport à la lecture des données dans un jeu de données (à l'aide d'une sélection de procédures stockées) puis à la lecture en boucle des enregistrements? Le jeu de données n'est pas volumineux. Il comprend 6 tables, chacune contenant environ 10 enregistrements, principalement des GUID, plusieurs champs nvarchar (100), une colonne flottante et un nvarchar (max).

Était-ce utile?

La solution

Cela dépend probablement de l'ensemble de données que vous récupérerez peut-être en arrière (plus cet ensemble est grand, plus il peut être logique d'exécuter à l'intérieur de SQL Server au lieu de le transmettre), mais j'ai tendance à penser que si vous cherchez à effectuer des calculs, faites-le dans votre code et loin de vos procédures stockées. Si vous devez utiliser des curseurs pour rassembler les données, qu’il en soit, mais leur utilisation pour effectuer des calculs et d’autres fonctions de non-récupération ne devrait, selon moi, pas être évité.

Modifier : cette Répondre à une autre question connexe donnera quelques avantages et inconvénients aux curseurs par rapport à la boucle. Cette réponse semblerait être en contradiction avec mon affirmation précédente (lire ci-dessus) sur la mise à l'échelle. Cela semble suggérer que plus vous grossissez, plus vous voudrez probablement le déplacer vers votre code plutôt que dans la procédure stockée.

Autres conseils

alternative au curseur

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

Les curseurs devraient être plus rapides, mais si de nombreux utilisateurs l'exécutent, les ressources de votre serveur seront épuisées. N'oubliez pas que vous utilisez un langage de codage plus puissant pour écrire des boucles en .Net plutôt qu'en SQL.

Il existe très peu d'occasions où un curseur ne peut pas être remplacé à l'aide d'un ensemble SQL standard. Si vous effectuez cette opération sur le serveur, vous pourrez peut-être utiliser une opération basée sur un ensemble. Plus de détails sur ce que vous faites?

Si vous décidez d'utiliser un curseur, gardez à l'esprit qu'un curseur en lecture seule FAST_FORWARD vous donnera les meilleures performances et assurez-vous que vous utilisez l'instruction deallocate pour le libérer. Consultez ici pour des astuces sur le curseur

.

Les curseurs devraient être plus rapides (à moins que vous ne fassiez quelque chose de bizarre en SQL et non en ADO.NET).

Cela dit, j’ai souvent constaté que les curseurs peuvent être éliminés avec un peu de jeu jeté sur les jambes. Quelle est la procédure à suivre?

À la vôtre,
Eric

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top