Quel est le meilleur:Des requêtes Ad hoc ou des procédures stockées?[fermé]

StackOverflow https://stackoverflow.com/questions/22907

  •  09-06-2019
  •  | 
  •  

Question

En supposant que vous ne pouvez pas utiliser LINQ pour quelque raison que ce soit, est-il préférable de placer vos requêtes, procédures stockées, ou bien est-ce une bonne pratique pour exécuter ad hoc des requêtes sur la base de données (par exemple, SQL Server pour la commodité du raisonnement)?

Était-ce utile?

La solution

Dans mon expérience de l'écriture de la plupart WinForms Client/Serveur, applications de ces conclusions que je suis arrivé à:

Utiliser Des Procédures Stockées:

  1. Pour tout complexe de données de travail.Si vous allez faire quelque chose de vraiment exigeant un curseur ou de tables temporaires, il est généralement plus rapide de le faire au sein de SQL Server.
  2. Lorsque vous avez besoin de verrouiller l'accès aux données.Si vous ne donnez pas accès à la table des utilisateurs (ou de rôle ou autre), vous pouvez être sûr que la seule façon d'interagir avec les données est par le biais de la SP que vous créez.

Utiliser des requêtes ad-hoc:

  1. Pour CRUD lorsque vous n'avez pas besoin de restreindre l'accès aux données (ou de le faire d'une autre manière).
  2. Pour les recherches simples.La création de SP pour un tas de critères de recherche est une douleur et difficile à maintenir.Si vous pouvez générer un raisonnablement rapide requête de recherche de l'utiliser.

Dans la plupart de mes applications que j'ai utilisé à la fois SP et ad-hoc sql, mais je trouve que je suis l'aide de SP est de moins en moins comme ils finissent par être le code exactement comme en C#, seulement plus fort de la version de contrôle, de test et de maintenance.Je vous conseille d'utiliser ad-hoc sql, sauf si vous pouvez trouver une raison de ne pas.

Autres conseils

Je ne peux pas parler d'autre chose que de SQL Server, mais l'argument est pas de manière significative valide, à moins que vous êtes sur 6.5 ou une version antérieure.SQL Server a été mise en cache ad-hoc des plans d'exécution pour près d'une décennie maintenant.

Procédures stockées représentent un contrat de logiciel qui encapsule les mesures prises à l'encontre de la base de données.Le code dans les procédures, et même le schéma de la base de données elle-même peut être modifié sans affecter compilé, déployé code, juste pour les entrées et les sorties de la procédure reste la même.

Par l'incorporation de requêtes dans votre application, vous sont étroitement couplage-vous à votre modèle de données.

Pour la même raison, il est également préférable de ne pas simplement créer des procédures stockées qui sont juste CRUD des requêtes sur toutes les tables de votre base de données, puisque c'est encore le couplage.Les procédures devraient plutôt être encombrants, à grain grossier opérations.

À partir d'un point de vue sécurité, il est de bonne pratique de refuser db_datareader et db_datawriter à partir de votre application et de ne permettre l'accès à des procédures stockées.

Je pense que c'est un conflit entre des gens qui doivent maintenir la base de données et les personnes qui développent des interfaces utilisateur.

Les données de personne, je ne voudrais pas envisager de travailler avec une base de données est accessible par le biais de requêtes spécifiques, car ils sont difficiles à tune ou à gérer.Comment puis-je savoir quel effet d'un changement du schéma aura?En outre, je ne pense pas que les utilisateurs doivent jamais être accordé un accès direct à la base de données des tables pour des raisons de sécurité (et je ne parle pas seulement des attaques par injection SQL, mais aussi parce qu'il est un de base du contrôle interne de ne pas permettre à des droits directs et exiger que tous les utilisateurs d'utiliser uniquement le procs conçu pour l'application.C'est pour éviter d'éventuelles fraudes.Tout le système financier qui vous permet d'insérer, mettre à jour ou supprimer des droits aux tables est a un énorme risque de fraude.C'est une mauvaise chose.).

Les bases de données ne sont pas orientées objet et le code qui semble bon à partir d'un objet point de vue est peut être extrêmement mauvais à partir d'une base de données de point de vue.

Nos développeurs nous disent qu'ils sont heureux que tous nos databse l'accès est par le biais de procs car il le rend beaucoup plus rapide pour corriger les données centrée sur le bug et ensuite il suffit de lancer le proc sur l'environnement de production plutôt que de créer une nouvelle branche de la code et de recompiler et de le recharger à la production.Nous avons besoin de toutes nos procs pour être dans la subversion, la source de contrôle n'est pas du tout un problème.Si elle n'est pas dans la Subversion, il va régulièrement être éliminés par les administrateurs de base de données, donc il n'y a pas de résistance à l'aide de la Source de Contrôle.

Les procédures stockées sont certainement le chemin à parcourir...ils sont compilés, ont plan d'exécution avant de la main et vous pourriez faire la gestion des droits sur eux.

Je ne comprends pas toute cette source de problème de contrôle sur la procédure stockée.Vous avez certainement peut-contrôle de la source d'eux, si seulement vous êtes un peu la discipline.

Toujours commencer avec un .fichier sql qui est la source de votre procédure stockée.Le mettre dans le contrôle de version une fois que vous avez écrit votre code.La prochaine fois que vous souhaitez modifier votre procédure stockée l'obtenir à partir de votre source de contrôle de votre base de données.Si vous suivez cela, vous aurez aussi une bonne source de contrôle de votre code.

Je voudrais citer Tom Kyte à partir d'Oracle ici...Voici son règne sur où les à écrire du code...bien qu'un peu sans rapport, mais bon à savoir, je suppose.

  1. Commencer avec des procédures stockées en PL/SQL...
  2. Si vous pensez que quelque chose ne peut pas être effectuée à l'aide de la procédure stockée PL/SQL, utiliser Java procédure stockée.
  3. Si vous pensez que quelque chose ne peut pas être fait à l'aide de Java procédure Stockée, considérez Pro*c.
  4. Si vous pensez que vous ne pouvez pas obtenir quelque chose à l'aide de Pro*C, vous voudrez peut-être repenser ce que vous devez faire.

Dans notre application, il y a une couche de code qui fournit le contenu de la requête (et est parfois un appel à une procédure stockée).Cela nous permet de:

  • facilement toutes les requêtes sous contrôle de version
  • pour faire ce que jamais des changements sont nécessaires pour chaque requête pour les différents serveurs de base de données
  • élimine la répétition du même code de requête par le biais de notre code

Le contrôle d'accès est mis en œuvre dans la couche du milieu, plutôt que dans la base de données, de sorte que nous n'avons pas besoin de procédures stockées là.C'est en quelque sorte une voie médiane entre des requêtes ad hoc et stockées procs.

Ma réponse à partir d'un autre post:Les Procédures stockées sont PLUS facile à maintenir car:

  • Vous n'avez pas à recompiler votre application en C# lorsque vous voulez modifier certains SQL
  • Vous finissez par la réutilisation de code SQL.

La répétition de Code est la pire chose que vous pouvez faire lorsque vous essayez de construire une application maintenable!

Ce qui se passe quand vous trouvez une erreur de logique qui doit être corrigée en plusieurs endroits?Vous êtes plus enclins à oublier de modifier le dernier endroit où vous copier-collé votre code.

À mon avis, de la sécurité et des performances des gains sont un ajout plus. Vous pouvez toujours écrire anxieux et inefficace de procédures stockées SQL.

Plus facile de port DB - pas de procs de port

Ce n'est pas très dur de faire un script de toutes vos procédures stockées pour la création d'une autre base de données.En fait - c'est plus facile que d'exporter vos tables, car il n'existe pas de primaire et de clé étrangère pour s'en inquiéter.

Il y a des arguments convaincants pour les procédures stockées sont tous situés dans un référentiel central, mais sont (potentiellement) difficile de migrer et des requêtes ad hoc sont plus facile à déboguer votre code, mais ils peuvent aussi être plus difficile à trouver dans le code.

L'argument que les procédures stockées sont plus efficaces ne retient pas l'eau plus.texte du lien

Faire un google pour la Procédure Stockée vs Requête Dynamique montrera décent arguments de toute façon et probablement le meilleur pour vous faire votre propre décision...

Procédures de la banque devraient être utilisées autant que possible, si votre écriture SQL dans le code de votre déjà vous mettre en place pour des maux de tête à l'avenir.Il prend environ le même temps pour écrire une procédure stockée comme il n'en faut pour l'écrire dans le code.

Considérons une requête qui fonctionne très bien sous une charge moyenne, mais une fois qu'il va en à plein temps à la production de votre mal optimisée de requêtes de marteaux, le système et l'amène à une analyse.Dans la plupart des serveurs SQL vous n'êtes pas la seule application/service qui l'utilise.Votre application a apporté un tas de gens en colère à votre porte.

Si vous avez vos requêtes dans SPROCs vous permettent également à votre environnement de DBA à gérer et à optimiser avec recompilation ou de la rupture de votre application.Rappelez-vous DBA sont des experts dans ce domaine, ils savent quoi faire et ne pas faire.Il est logique d'utiliser leurs connaissances accrues!

EDIT:quelqu'un a dit que recompiler est un prétexte paresseux!ouais permet de voir comment paresseux que vous ressentez quand vous avez de recompiler et de déployer votre application à 1000 postes de travail, le tout est que l'administrateur vous a dit que votre Requête ad-hoc est manger trop de temps du Serveur!

quelqu'un a dit que recompiler est un prétexte paresseux!ouais permet de voir comment paresseux que vous ressentez quand vous avez de recompiler et de déployer votre application à 1000 postes de travail, le tout est que l'administrateur vous a dit que votre Requête ad-hoc est manger trop de temps du Serveur!

est-il bon de l'architecture de système si vous les laissez se connecter 1000 postes de travail directement à la base de données?

Quelques choses à penser ici: Qui A Besoin De Procédures Stockées, De Toute Façon?

Clairement, c'est une question de vos propres besoins et préférences, mais une chose très importante à penser lors de l'utilisation des requêtes ad hoc dans un lieu public face à l'environnement est la sécurité.Toujours paramétrer eux et de regarder pour le type de vulnérabilités comme Les attaques par injection SQL.

Les Procédures stockées sont grands parce qu'ils peuvent être modifiés sans recompiler.Je voudrais essayer de les utiliser aussi souvent que possible.

Je ne l'utilise ad-hoc pour les requêtes sont générées dynamiquement en fonction de l'entrée utilisateur.

Procs pour les raisons mentionnées par les autres et il est plus facile d'ajuster un proc avec des profils ou des parties d'un proc.De cette façon, vous n'avez pas à dire à quelqu'un pour exécuter son application pour savoir ce qui est envoyé à SQL server

Si vous utilisez des requêtes ad-hoc assurez-vous qu'ils sont paramétrées

Parametized SQL ou une procédure stockée...n'a pas d'importance à partir d'une performance point...vous pouvez interroger optimiser un ou l'autre.

Pour moi, les derniers de bénéficier d'une procédure stockée est que je peut éliminer un grand nombre de SQL gestion des droits par l'octroi des mon des droits de connexion à exécuter sprocs...si vous utilisez Parametized SQL le nom de connexion dans votre chaîne de connexion a beaucoup plus de droits (écriture de TOUTE sorte d'instruction select sur l'une des tables qu'ils ont aussi accès, par exemple).

Je préfère encore Parametized SQL si...

Je n'ai pas trouvé d'argument convaincant en faveur de l'aide de requêtes ad-hoc.En particulier ceux mélangés avec C#/Java/PHP code.

La procédure stockée performance argument est discutable - les 3 premiers Sgbdr utiliser la requête plan de mise en cache et ont été pendant un certain temps.Son été documentées...Ou est-1995 encore?

Cependant, l'intégration de SQL dans votre app est une terrible conception trop - entretien de code semble être un manque de concept pour beaucoup.

Si une application peut commencer à partir de zéro avec un ORM (greenfield applications sont loin et peu entre les deux!) c'est un excellent choix de votre modèle de classe de lecteurs de votre DB modèle et permet d'économiser BEAUCOUP de temps.

Si un ORM n'est pas disponible, nous avons pris un hybride de l'approche de la création d'une ressource SQL fichier XML pour rechercher des chaînes SQL que nous avons besoin d'eux (ils sont alors mis en cache par le cadre de ressources).Si le SQL besoins des mineurs, la manipulation de son fait dans le code, et si les principaux SQL de manipulation de chaîne est nécessaire nous repenser l'approche.

Cette approche hybride prête à en faciliter la gestion par les développeurs (peut-être que nous sommes la minorité que mon équipe est assez lumineux pour lire un plan de requête) et le déploiement est une simple caisse à partir de SVN.Aussi, il rend la commutation Sgbdr plus facile - il vous suffit de changer la ressource SQL fichier (pas aussi facilement qu'un outil ORM bien sûr, mais la connexion à des systèmes ou des non-prise en charge de la base de données cela fonctionne)

Dépend de ce que votre but est.Si vous souhaitez récupérer une liste d'éléments et il se produit une fois au cours de votre application à l'ensemble de la piste par exemple, il n'est probablement pas la valeur de l'effort de l'aide d'une procédure stockée.D'autre part, une requête qui s'exécute à plusieurs reprises et prend une (relativement) beaucoup de temps à exécuter est un excellent candidat pour le stockage de base de données, car le rendement sera meilleur.

Si votre application se trouve presque entièrement dans la base de données, procédures stockées sont un no-brainer.Si vous écrivez une application de bureau pour lequel la base de données est de façon marginale seulement important, des requêtes ad-hoc peut être une meilleure option, car elle garde l'ensemble de votre code dans un seul endroit.

@Terrapin:Je pense que votre affirmation que le fait que vous n'avez pas à recompiler votre application pour faire des modifications qui rend les procédures stockées, une meilleure option est un non-starter.Il peut y avoir des raisons de choisir des procédures stockées sur des requêtes ad-hoc, mais en l'absence de quoi que ce soit d'autre convaincante, la compilation problème semble être la paresse plutôt que d'une réelle raison.

Mon expérience est que 90% des requêtes et/ou des procédures stockées ne doit pas être écrite à tous (au moins à la main).

L'accès aux données devraient être générés en quelque sorte automatiquement.Vous pouvez décider si vous souhaitez staticly générer des procédures moment de la compilation ou de manière dynamique au moment de l'exécution, mais lorsque vous souhaitez ajouter une colonne à la table (propriété de l'objet), vous devez modifier un seul fichier.

Je préfère garder toutes les données accès logique dans le code du programme, dans lequel la couche d'accès aux données s'exécute directement des requêtes SQL.D'autre part, les données gestion la logique que j'ai mis dans la base de données sous la forme de triggers, procédures stockées, des fonctions personnalisées et autres joyeusetés.Un exemple de quelque chose que j'estime digne de base de données-la ratification est la génération de données, assumer notre client dispose d'un Prénom et d'un Nom.Maintenant, l'interface utilisateur a besoin d'un nom d'Affichage, qui est dérivée à partir de certains non négligeable de la logique.Pour cette génération, j'ai créer une procédure stockée qui est ensuite exécuté par un déclencheur à chaque fois que la ligne (ou une autre source de données) est mis à jour.

Il semble y avoir un peu malentendu commun que la couche d'accès aux données EST la base de données et tout, de données et d'accès aux données va là-bas "juste parce que".C'est tout simplement une erreur, mais je vois beaucoup de dessins qui découlent de cette idée.C'est peut-être un local phenomonon, cependant.

J'ai peut-être juste désactivé l'idée de SPs après avoir vu tant de mal conçus.Par exemple, un projet, j'ai participé à utilisé un ensemble de CRUD des procédures stockées pour chaque tableau et chaque requête qu'il a rencontrées.En faisant ainsi, ils ont simplement ajouté une autre complètement inutile couche.Il est pénible à même de penser à de telles choses.

Ces jours-ci je n'ai pratiquement jamais utiliser des procédures stockées.Je ne l'utilise que pour compliqué les requêtes sql qui ne peuvent pas facilement être fait dans le code.

L'une des principales raisons est parce que les procédures stockées ne pas fonctionner aussi bien avec OU cartographes.

Ces jours, je pense que vous avez besoin d'une très bonne raison pour écrire une application d'entreprise / système d'information qui n'utilise pas certains de tri de OU mappeur.

Procédure stockée travail en tant que bloc de code donc, à la place de ad hoc de la requête, il travaille vite.Une autre chose est la procédure stockée donner recompiler option qui est la meilleure partie de SQL que vous venez de l'utiliser pour les procédures stockées rien de tel dans ad hoc requête.

Certains résultat dans la requête et la procédure stockée sont différentes c'est mon exp.L'utilisation de fonte et secret de fonction pour vérifier cela.

Doit utiliser une procédure stockée pour de grands projets pour améliorer les performances.

J'avais 420 procédures en mon projet et c'est le travail très bien pour moi.Je travaille depuis 3 ans sur ce projet.

Donc, utiliser uniquement des procédures pour toute transaction.

est-il bon de l'architecture de système si vous laissez vous connecter 1000 postes de travail directement à base de données?

Non, il n'est évidemment pas, c'est peut-être un mauvais exemple, mais je pense que le point que j'essayais de faire est clair, votre DBA s'occupe de votre infrastructure de base de données c'est là que leur expertise est, la farce SQL dans le code des verrous de la porte et de leur expertise.

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