LINQ-to-SQL vs procédures stockées? [fermé]

j'ai jeté un oeil au "Guide du débutant à LINQ" post ici sur StackOverflow ( Guide du débutant à LINQ ), mais avait une question de suivi:

nous sommes sur le point de monter un nouveau projet où la quasi-totalité de nos op de base de données sera des extractions de données assez simples (il y a une autre partie du projet qui écrit déjà les données). La plupart de nos autres projets jusqu'à présent utilisent des procédures stockées pour de telles choses. Cependant, je tiens à utiliser LINQ-to-SQL si cela a plus de sens.

donc, la question Est la suivante: pour les extractions de données simples, quelle approche est la meilleure, LINQ-to-SQL ou procs stockés? Des pros ou des escrocs?

Merci.

183
demandé sur Community 2008-08-18 16:37:57

23 réponses

Certains avantages de LINQ sur sprocs:

  1. Type safety : je pense que nous le comprenons tous.
  2. Abstraction : ceci est particulièrement vrai avec LINQ-to-Entities . Cette abstraction permet également au framework d'ajouter des améliorations supplémentaires dont vous pouvez facilement profiter. PLINQ est un exemple de support multi-filetage à LINQ. Les changements de Code sont minimes pour ajouter ce support. Il serait beaucoup plus difficile de faire ce code d'accès aux données qui appelle simplement sprocs.
  3. soutien au débogage : je peux utiliser n'importe quel débogueur .NET pour déboguer les requêtes. Avec sprocs, vous ne pouvez pas facilement déboguer le SQL et cette expérience est largement liée à votre fournisseur de base de données (MS SQL Server fournit un analyseur de requête, mais souvent ce n'est pas suffisant).
  4. vendeur agnostic : LINQ fonctionne avec beaucoup de bases de données et le nombre de bases de données prises en charge ne fera qu'augmenter. Les sproc ne sont pas toujours portables entre les bases de données, soit à cause de la syntaxe variable ou du support des fonctionnalités (si la base de données supporte les sproc).
  5. déploiement : D'autres l'ont déjà mentionné, mais il est plus facile de déployer un seul assemblage que de déployer un ensemble de sproc. Ceci est également lié au n ° 4.
  6. Plus facile : vous n'avez pas à apprendre le T-SQL pour faire l'accès aux données, ni à apprendre L'API d'accès aux données (par ex. ADO.NET) nécessaire pour appeler les sproc. Ceci est lié aux numéros 3 et 4.

Quelques inconvénients de LINQ vs sprocs:

  1. Network traffic : les sproc n'ont besoin que de sérialiser les données sproc-name et argument sur le fil pendant que LINQ envoie la requête entière. Cela peut devenir vraiment mauvais si le les requêtes sont très complexes. Cependant, L'abstraction de LINQ permet à Microsoft de l'améliorer au fil du temps.
  2. moins flexible : les sproc peuvent profiter pleinement des fonctionnalités d'une base de données. LINQ a tendance à être plus générique dans son support. Ceci est commun dans tout type d'abstraction de langage (par exemple C# vs assembleur).
  3. Recompiler : Si vous avez besoin d'apporter des modifications à la façon dont vous faites l'accès aux données, vous devez recompiler, version, et redéployer votre assemblage. Sprocs peut parfois permettre à un administrateur de base pour accorder l'accès aux données de routine sans la nécessité de redéployer quoi que ce soit.

la sécurité et la gérabilité sont des sujets sur lesquels les gens se disputent aussi.

  1. Security : par exemple, vous pouvez protéger vos données sensibles en limitant l'accès aux tables directement, et mettre ACLs sur les sproc. Avec LINQ, cependant, vous pouvez toujours restreindre l'accès direct aux tables et à la place mettre ACLs sur table updatable vues pour atteindre une fin similaire (en supposant que votre base de données supporte des vues updatable).
  2. Manageability : L'utilisation de vues vous donne également l'avantage de protéger votre application non-rupture des changements de schéma (comme la normalisation de table). Vous pouvez mettre à jour la vue sans avoir à modifier votre code d'accès aux données.

j'étais un grand sproc, mais je commence à me pencher vers LINQ comme une meilleure alternative en général. S'il y a des endroits où les sproc sont nettement meilleurs, alors je vais probablement encore écrire un sproc mais y accéder en utilisant LINQ. :)

181
répondu Chris Gillum 2008-08-26 20:04:51

je suis généralement un partisan de tout mettre dans les procédures stockées, pour toutes les raisons les AD ont été Harpage sur des années. Dans le cas de Linq, il est vrai qu'il n'y aura pas de différence de performances avec les requêtes CRUD simples.

mais gardez quelques choses à l'esprit lors de la prise de cette décision: en utilisant n'importe quels couples ORM vous étroitement à votre modèle de données. Un DBA n'a aucune liberté pour apporter des changements au modèle de données sans vous forcer à changer votre code compilé. Avec procédures stockées, vous pouvez cacher ce genre de changements dans une certaine mesure, puisque la liste de paramètres et les ensembles de résultats retournés à partir d'une procédure représentent son contrat, et les innards peuvent être changés autour, juste tant que ce contrat est toujours respecté.

et aussi, si Linq est utilisé pour des requêtes plus complexes, ajuster la base de données devient une tâche beaucoup plus difficile. Quand une procédure stockée est lente, le DBA peut se concentrer totalement sur le code dans l'isolement, et a beaucoup de options, juste pour que le contrat soit toujours satisfait quand il / elle est fait.

j'ai vu beaucoup, beaucoup de cas où de graves problèmes dans une application ont été résolus par des changements au schéma et au code dans les procédures stockées sans aucun changement au Code déployé et compilé.

peut-être Qu'une approche hybird serait bien avec Linq? Linq peut, bien sûr, être utilisé pour appeler des procédures stockées.

73
répondu Eric Z Beard 2008-10-10 15:40:11

Linq à Sql.

Sql server cache Les plans de requête, donc il n'y a aucun gain de performance pour sprocs.

vos énoncés linq, d'un autre côté, seront logiquement inclus et testés avec votre application. Sprocs sont toujours un peu séparés et sont plus difficiles à maintenir et à tester.

si je travaillais sur une nouvelle application à partir de zéro en ce moment, je n'utiliserais que Linq, pas de sproc.

64
répondu Keith 2008-08-18 12:46:04

pour la récupération de données de base, je m'adresserais sans hésitation à Linq.

depuis que J'ai déménagé à Linq j'ai trouvé les avantages suivants:

  1. déboguer mon DAL n'a jamais été aussi simple.
  2. compilez la sécurité du temps lorsque votre schéma change est inestimable.
  3. le déploiement est plus facile parce que tout est compilé dans DLL. Plus de gestion des scripts de déploiement.
  4. parce que Linq peut prendre en charge tout ce qui implémente l'interface IQueryable, vous pourrez utiliser la même syntaxe pour interroger XML, les objets et toute autre source de données sans avoir à apprendre une nouvelle syntaxe
37
répondu lomaxx 2008-08-18 13:08:31

LINQ va gonfler le cache de la procédure

si une application utilise LINQ à SQL et que les requêtes impliquent l'utilisation de chaînes qui peuvent être très variables en longueur, le cache de procédure SQL Server sera gonflé avec une version de la requête pour chaque longueur de chaîne possible. Par exemple, considérez les requêtes très simples suivantes créées contre la personne.Tableau des types d'adresses dans la base de données de L'Aventureworks2008:

var p = 
    from n in x.AddressTypes 
    where n.Name == "Billing" 
    select n;

var p = 
    from n in x.AddressTypes 
    where n.Name == "Main Office" 
    select n;

si ces deux requêtes sont exécutées, nous verrons deux entrées dans le cache de procédure du serveur SQL: l'une liée avec un NVARCHAR(7), et l'autre avec un NVARCHAR(11). Imaginez maintenant s'il y avait des centaines ou des milliers de chaînes d'entrée différentes, toutes avec des longueurs différentes. Le cache de procédure serait inutilement rempli avec toutes sortes de plans différents pour la même requête exacte.

plus ici: https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=363290

26
répondu SQLMenace 2015-05-21 23:29:14

je pense que l'argument pro LINQ semble venir de gens qui n'ont pas d'histoire avec le développement de base de données (en général).

en particulier si vous utilisez un produit comme VS DB Pro ou Team Suite, beaucoup des arguments présentés ici ne s'appliquent pas, par exemple:

plus difficile à entretenir et à tester: VS fournit la vérification complète de la syntaxe, la vérification du style, la vérification des références et des contraintes et plus encore. Il fournit également des capacités complètes d'essai de l'unité et outils de refacturation.

LINQ rend le vrai test unitaire impossible car (à mon avis) il échoue le test acide.

le débogage est plus facile à LINQ: Pourquoi? VS permet l'intégration complète du code géré et le débogage régulier des SPs.

compilé dans une DLL unique plutôt que des scripts de déploiement: Encore une fois, VS vient à la rescousse où il peut construire et déployer des bases de données complètes ou faire des changements incrémentiels sans danger pour les données.

Ne pas ont à apprendre le TSQL avec LINQ: Non, mais tu dois apprendre LINQ-où est le bénéfice?

je ne vois pas cela comme un avantage. Être capable de changer quelque chose dans l'isolement peut sembler bien en théorie, mais juste parce que les changements remplissent un contrat ne signifie pas qu'il retourne les bons résultats. Pour être en mesure de déterminer quels sont les bons résultats, vous avez besoin de contexte et vous obtenez ce contexte à partir du code appelant.

Um, les applications à couplage lâche sont le but ultime de tous les bons programmeurs car ils augmentent vraiment la flexibilité. Être capable de changer les choses dans l'isolement est fantastique, et ce sont les tests de votre unité qui garantira qu'il est toujours en retour des résultats appropriés.

avant que vous ne vous fâchiez, je pense que LINQ a sa place et un grand avenir. Mais pour les applications complexes et à forte intensité de données, Je ne pense pas qu'il soit prêt à remplacer les procédures stockées. C'était une vue que je avait fait écho par un MVP chez TechEd cette année (ils resteront anonymes).

EDIT: Le LINQ to SQL Procédure Stockée côté des choses, c'est quelque chose que j'ai toujours besoin d'en lire plus sur selon ce que j'ai trouver je peut modifier mon ci-dessus diatribe ;)

17
répondu Dr8k 2008-09-12 04:42:23

LINQ est nouveau et a sa place. LINQ n ' est pas inventé pour remplacer la procédure stockée.

ici je vais me concentrer sur quelques mythes de performance & contre, juste pour "LINQ à SQL", bien sûr je pourrais être totalement faux ;-)

(1) les gens disent que LINQ statment peut" cache " dans SQL server, donc il ne perd pas de performance. Partiellement vrai. "LINQ to SQL" est en fait la traduction de la syntaxe de LINQ à TSQL. Du point de vue de la performance,un ADO.NET la déclaration SQL n'a aucune différence que LINQ.

(2)à titre d'exemple, l'IU du service à la clientèle a une fonction de" transfert de Compte". cette fonction elle-même peut mettre à jour des tables de 10 DB et retourner des messages en une seule prise de vue. Avec LINQ, vous devez construire un ensemble d'énoncés et les envoyer en un lot à SQL server. la performance de ce lot LINQ->TSQL traduit peut difficilement correspondre à la procédure stockée. La raison? parce que vous pouvez modifier la plus petite unité de l'instruction dans Stockées procédure en utilisant le profileur SQL intégré et l'outil de plan d'exécution, vous ne pouvez pas faire cela dans LINQ.

le point est, en parlant une table DB simple et un petit ensemble de données CRUD, LINQ est aussi rapide que SP. Mais pour une logique beaucoup plus compliquée, la procédure stockée est plus de performance tweakable.

(3)" LINQ to SQL " Makes easily newbies to introduce performance hogs. N'importe quel gars TSQL senior peut vous dire quand ne pas utiliser le curseur (fondamentalement, vous ne devriez pas utiliser le curseur dans TSQL dans la plupart des cas). Avec LINQ et la boucle charmante "foreach" avec query, il est si facile pour un débutant d'écrire un tel code:

foreach(Customer c in query)
{
  c.Country = "Wonder Land";
}
ctx.SubmitChanges();

vous pouvez voir ce code décent facile est si attrayant. Mais sous le capot, l'exécution. net traduit simplement ceci en une mise à jour par lots. S'il y a seulement 500 lignes, c'est un lot TSQL de 500 lignes; S'il y a des millions de lignes, c'est un hit. Bien sûr, l'utilisateur expérimenté ne va pas utiliser cette façon pour faire ce travail, mais le fait est, il est si facile de tomber dans ce façon.

17
répondu 2008-12-03 05:40:53

le meilleur code n'est pas de code, et avec les procédures stockées vous devez écrire au moins un certain code dans la base de données et le code dans l'application pour l'appeler , alors qu'avec LINQ à SQL ou LINQ à Entities, vous n'avez pas à écrire de code supplémentaire au-delà de toute autre requête LINQ en dehors de l'instanciation d'un objet de contexte.

12
répondu Mark Cidade 2008-08-18 12:45:13

LINQ a certainement sa place dans les bases de données spécifiques aux applications et dans les petites entreprises.

mais dans une grande entreprise, où les bases de données centrales servent de Centre de données communes pour de nombreuses applications, nous avons besoin d'abstraction. Nous devons centraliser la gestion de la sécurité et montrer les historiques d'accès. Nous devons être en mesure de faire une analyse d'impact: si je fais une petite modification au modèle de données pour répondre à un nouveau besoin commercial, quelles questions doivent être modifiées et quelles applications doivent être re-testé? Les vues et les procédures stockées me donnent ça. Si LINQ peut faire tout cela, et rendre nos programmeurs plus productifs, Je m'en réjouis -- quelqu'un a-t-il de l'expérience en l'utilisant dans ce genre d'environnement?

10
répondu 2008-10-09 14:43:53

administrateur de base de données n'a pas la liberté de faire des modifications le modèle de données sans vous forcer pour changer votre code compilé. Avec procédures stockées, vous pouvez masquer ces sortes de changements dans une certaine mesure, depuis la liste des paramètres et l'ensemble des résultats (s) retour d'un représentant de procédure son contrat, et les entrailles peut être a changé, juste aussi longtemps que l' le contrat est toujours respecté.

je ne vois pas cela comme un avantage. Être être capable de changer quelque chose isolément peut sembler bien en théorie, mais ce n'est pas parce que les changements remplissent un contrat que cela veut dire qu'il retourne les bons résultats. Pour être en mesure de déterminer quels sont les bons résultats, vous avez besoin de contexte et vous obtenez ce contexte à partir du code appelant.

8
répondu lomaxx 2008-08-19 14:28:23

IMHO, RAD = LINQ, RUP = Stored Procs. J'ai travaillé pour une grande entreprise Fortune 500 pendant de nombreuses années, à de nombreux niveaux, y compris la gestion, et franchement, je ne voudrais jamais embaucher des développeurs RUP pour faire du développement RAD. Ils sont tellement discrets qu'ils ne savent que faire à d'autres niveaux du processus. Dans un environnement cloisonné, il est logique de donner aux AD le contrôle des données par des points d'entrée très précis, parce que les autres ne savent franchement pas les meilleures façons d'effectuer les données. gestion.

, Mais les grandes entreprises déplacer douloureusement lent dans le domaine du développement, et c'est extrêmement coûteux. Il y a des moments où vous avez besoin de se déplacer plus rapidement pour économiser du temps et de l'argent, et LINQ fournit cela et plus en pique.

Parfois, je pense que les AD ont un parti pris contre LINQ parce qu'ils pensent que cela menace leur sécurité d'emploi. Mais c'est la nature de la bête, mesdames et messieurs.

7
répondu Craig 2009-06-30 19:04:17

je pense que tu as besoin d'aller avec procs pour quelque chose de réel.

A) écrire toute votre logique dans linq signifie que votre base de données est moins utile parce que seule votre application peut la consommer.

B) Je ne suis pas convaincu que la modélisation d'objet est meilleure que la modélisation relationnelle de toute façon.

C) tester et développer une procédure stockée en SQL est beaucoup plus rapide qu'un cycle de compilation dans n'importe quel environnement Visual Studio. Vous venez de edit, F5 et cliquez sur select et vous partez pour les courses.

D) il est plus facile de gérer et de déployer les procédures stockées que les assemblages.. vous mettez le fichier sur le serveur, et appuyez sur F5...

E) Linq à sql écrit toujours du code merdique quand on ne s'y attend pas.

honnêtement, je pense que L'ultime chose serait que MS augmente le T-sql pour qu'il puisse faire une projection de jointure implicitement comme le fait linq. T-sql devrait savoir si vous voulu faire de l'ordre.comptes.partie, par exemple.

6
répondu Todd Bandrowsky 2012-02-08 16:35:56

LINQ n'interdit pas l'utilisation de procédures stockées. J'ai utilisé le mode mixte avec LINQ-SQL et LINQ-storedproc . Personnellement, je suis content de ne pas avoir à écrire les procs stockés....pwet-tu.

5
répondu kenny 2008-08-28 12:39:55

il y a aussi la question du possible 2.0 rollback. Croyez-moi, cela m'est arrivé à quelques reprises, alors je suis sûr que cela est arrivé à d'autres.

je suis également d'accord que l'abstraction est la meilleure. Avec le fait que le but original de n'importe quel ORM est de faire des RDBMS correspondent bien aux concepts OO. Cependant, si tout fonctionnait bien avant LINQ en ayant à s'écarter un peu des concepts OO, puis les visser. Les Concepts et la réalité ne vont pas toujours bien ensemble. Il n'y a pas de salle pour les militants fanatiques.

4
répondu 2008-10-20 03:14:09

je suppose que vous voulez dire Linq à Sql

pour toute commande CRUD, il est facile de dresser le profil des performances d'une procédure stockée par rapport à n'importe quelle technologie. Dans ce cas, la différence entre les deux sera négligeable. Essayez le profilage pour un 5 (types simples) objet de terrain plus de 100.000 questions sélectionner pour savoir s'il y a une différence réelle.

d'autre part, le vrai deal-breaker sera la question de savoir si vous vous sentez à l'aise de mettre votre business logic sur votre base de données ou non, ce qui est un argument contre les procédures stockées.

3
répondu Jon Limjap 2008-08-18 12:44:12

selon les gourous, je définis LINQ comme moto et SP comme voiture. Si vous voulez aller pour un court voyage et que vous n'avez que de petits passagers(dans ce cas 2), Allez gracieusement avec LINQ. Mais si vous voulez faire un voyage et avoir un grand groupe, je pense que vous devriez choisir SP.

en conclusion, le choix entre moto ou voiture dépend de votre itinéraire (affaires), de la longueur (temps), et des passagers (données).

J'espère que ça aidera, je me trompe peut-être. : D

3
répondu Kyaw Thura 2011-06-07 07:53:56

toutes ces réponses penchant vers LINQ parlent principalement de la facilité de développement qui est plus ou moins liée à une mauvaise qualité de codage ou à la paresse dans le codage. Je suis comme ça.

quelques avantages ou Linq , je lis ici que, facile à tester, facile à déboguer, etc, mais ceux-ci ne sont pas connectés à la sortie finale ou l'utilisateur final. Cela va toujours causer des problèmes à l'utilisateur final sur la performance. Quel est le point charger beaucoup de choses dans la mémoire et puis appliquer les filtres à l'aide de LINQ?

encore une fois sécurité de la typographie, est la mise en garde que "nous prenons soin d'éviter la mauvaise typographie" qui, encore une fois, mauvaise qualité, nous essayons d'améliorer en utilisant linq. Même dans ce cas, si quelque chose dans la base de données change, par exemple la taille de la colonne String, alors linq doit être recompilé et ne serait pas typesafe sans cela .. J'ai essayé.

bien que, nous avons trouvé est bon, doux, intéressant, etc tout en travaillant avec LINQ, il a l'inconvénient de cisaillement de faire de développeur paresseux :) et il est prouvé 1000 fois qu'il est mauvais (peut-être pire) sur les performances par rapport aux Stockées Procs.

arrêtez d'être paresseux. Je suis en train dur. :)

3
répondu Manish 2012-09-25 21:36:30

code stocké Procs vs (discussion précédente)

2
répondu liammclennan 2017-05-23 10:31:02

pour les opérations CRUDS simples avec un seul point d'accès aux données, je dirais D'aller pour LINQ si vous vous sentez à l'aise avec la syntaxe. Pour une logique plus compliquée, je pense que les sproc sont plus efficaces du point de vue des performances si vous êtes bon au T-SQL et à ses opérations plus avancées. Vous avez aussi L'aide de Tuning Advisor, SQL Server Profiler, déboguer vos requêtes depuis SSMS etc.

2
répondu Neo 2012-03-10 10:11:39

procédure stockée rend le test plus facile et vous pouvez changer la requête sans toucher le code d'application. Aussi avec linq, obtenir des données ne signifie pas que ce sont les bonnes données. Et tester l'exactitude des données signifie Exécuter l'application mais avec la procédure stockée il est facile de tester sans toucher l'application.

2
répondu dansasu11 2016-12-24 09:38:09

Le résultat peut être résumé ainsi:

LinqToSql pour petits sites, et prototypes. Cela permet de gagner du temps pour le prototypage.

Sps: Universal. Je peux affiner mes requêtes et toujours vérifier le plan D'exécution / Plan D'exécution estimé.

1
répondu pokrate 2011-08-24 04:30:03
Create PROCEDURE userInfoProcedure
    -- Add the parameters for the stored procedure here
    @FirstName varchar,
    @LastName varchar
AS
BEGIN

    SET NOCOUNT ON;

    -- Insert statements for procedure here
    SELECT FirstName  , LastName,Age from UserInfo where FirstName=@FirstName
    and LastName=@FirstName
END
GO

http://www.totaldotnet.com/Article/ShowArticle121_StoreProcBasic.aspx

1
répondu totaldonet 2011-11-16 23:09:05

LINQ et SQL ont leur place. Tous deux présentent des inconvénients et des avantages.

parfois, pour la récupération de données complexes, vous pourriez avoir besoin de procs stockés. Et parfois vous pouvez vouloir que d'autres personnes utilisent votre proc stocké dans Sql Server Management Studio.

Linq to Entities est idéal pour le développement rapide de CRUD.

sûr que vous pouvez construire une application en utilisant seulement l'un ou l'autre. Ou vous pouvez les mélanger. Tout se résume à votre exigence. Mais les procs stockés dans SQL ne disparaîtront pas de sitôt.

0
répondu live-love 2011-08-12 15:34:50