6
votes

Comment éviter les requêtes SQL inefficaces de ralentir un serveur de base de données

J'ai une application ASP .NET 4.5. Sur une page de maintenance est une zone de texte qui permet aux utilisateurs administratifs d'écrire SQL qui est exécuté directement contre la base de données SQL Server 2008.

occasionnellement, l'un des utilisateurs administratifs écrit un peu de SQL inefficace et le processus SQL Server commence à utiliser toutes les cycles de mémoire et de CPU sur le serveur. Nous devons ensuite commencer et arrêter le service pour obtenir le serveur réactif à nouveau.

Y a-t-il une façon que je puisse arrêter ces des requêtes consommant toutes les ressources? Ces requêtes ne reviendront pas assez rapidement pour que l'utilisateur les voyait, il est donc bon d'annuler la requête.

edit Je me rends compte qu'il serait préférable d'empêcher les utilisateurs d'écrire des requêtes SQL, mais malheureusement, je ne peux pas supprimer cette fonctionnalité de l'application. Les utilisateurs de l'administration ne veulent pas être éduqués.


4 commentaires

Si vous avez le Max degré de parallélisme défini sur illimité (ou plus que 1) Vous pouvez exécuter toutes les requêtes maxdop 1 pour les empêcher de manger tous les cœurs.


Cela dit, je ne connais pas de manière technique, autre que le commandement de commandement sur la connexion, ou sur la surveillance et l'éducation de ceux qui causent ces problèmes.


En supposant que vous ayez une configuration de production / mise en scène, faites le test administrateur des requêtes d'abord sur la mise en scène afin qu'une machine importante ne soit pas ligotée. Même si vous tuez la requête après une limite de temps, vous pouvez organiser des ressources importantes entre-temps (pas bonne en production).


Nous encourageons l'administrateur à tester des requêtes sur le système de stadification, mais nous ne pouvons pas les forcer à faire cela.


5 Réponses :




1
votes
  1. Créez un utilisateur qui n'aura plus ni moins de privilèges que nécessaire.

  2. Créez des données de connexion à l'utilisateur, vous ne paragronez pas avec les administrateurs qui écriront les requêtes.

  3. Créez un panneau / page / application où vous les laissez écrire leurs requêtes. Ici, vous pouvez ajouter des contraintes supplémentaires indisponibles au niveau du système RDBMS.

    Vous laissez vos utilisateurs accéder à ce panneau / page / application et ils dirigeront leurs questions à travers cela. S'ils font tout ce qui est indésirable découvert par vous, vous émettez simplement vos modifications pour le privilège et le panneau / page / application.


0 commentaires

-1
votes

meilleure façon d'empêcher SQL d'utiliser la mémoire / la CPU: Ne laissez pas les utilisateurs exécuter des requêtes.

SQL Server est censé utiliser toute la mémoire qu'elle peut l'obtenir de la main, de sorte que l'utilisation de la mémoire (ou l'utilisation de la CPU à ce sujet) ne serait pas raisonnée de redémarrer SQL.

Par défaut .NET SQLCOMMAND TEMPSOUT est de 30 secondes. Quand il est temps de sortir, la requête sera annulée. Les requêtes peuvent prendre un certain temps pour annuler, surtout si vous effectuiez une modification de données et que des retournements doivent se produire. Il est possible pendant que la requête est en cours d'exécution / annulation d'autres requêtes d'utilisateur sont bloquées. Cela pourrait faire semblant que le serveur SQL ne répond pas, mais il finira par terminer et votre utilisation de la CPU revenait à la normale. La mémoire continuera toutefois à être consommée par le processus SQL Server.


1 commentaires

Quel est le but d'une base de données si personne ne peut y accéder?



0
votes

laissant de côté les avantages / inconvénients de permettre aux utilisateurs de construire et de gérer leurs propres requêtes, une solution pourrait être d'utiliser le gouverneur de ressources fournie avec SQL 2008/2012. Je pense que ce n'est disponible que dans les éditions d'Enterprise qui pourraient signifier que vous ne pouvez pas l'utiliser (vous n'avez pas spécifié d'édition dans votre question).

TechNet a un article Sur la manière de gérer les charges de travail, mais vous pouvez essentiellement limiter une session (basée sur des détails de connexion ou toute autre information décernée) pour utiliser uniquement un% de la CPU et / ou de la mémoire.


0 commentaires