2009-04-29 7 views
2

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 ensemble de données (en utilisant des procédures stockées simples de sélection), puis en bouclant les enregistrements? L'ensemble de données n'est pas grand, il se compose de 6 tables, chacune avec environ 10 enregistrements, principalement des GUID, plusieurs champs nvarchar (100), une colonne float et un nvarchar (max).SQL Server - SQL Cursor vs ADO.NET

Répondre

2

Ce serait probablement dépendre de l'ensemble de données que vous pouvez extrayez retour (plus le jeu, plus logique, il peut être d'effectuer dans SQL Server au lieu de autour passage), 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 avez besoin d'utiliser des curseurs pour rassembler les données, qu'il en soit ainsi, mais en les utilisant pour effectuer des calculs et d'autres fonctions non récupérables, je pense que cela devrait être évité.

Modifier: Cette Answer à une autre question connexe donnera quelques avantages et inconvénients pour les curseurs contre la mise en boucle. Cette réponse semblerait entrer en conflit avec mon affirmation précédente (lire ci-dessus) sur la mise à l'échelle. Semble suggérer que plus vous obtenez grand, plus vous voudrez probablement le déplacer vers votre code plutôt que dans la procédure stockée.

0

Les curseurs devraient être plus rapides (sauf si vous faites quelque chose de bizarre dans SQL et pas dans ADO.NET). Cela dit, j'ai souvent constaté que les curseurs peuvent être éliminés avec un peu de jeu de jambes. Quelle est la procédure que vous devez faire?

Cheers,
Eric

1

Les curseurs devraient être plus rapides, mais si vous avez beaucoup d'utilisateurs, cela va épuiser les ressources de votre serveur. Gardez à l'esprit que vous avez un langage de codage plus puissant lorsque vous écrivez des boucles dans .Net plutôt que dans 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 pouvez 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 d'utiliser l'instruction deallocate pour le libérer. Voir here pour obtenir des conseils de curseur

1

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


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

end