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. P>
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. p>
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. P>
edit fort> 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. P>
5 Réponses :
Vous pouvez définir le gouverneur de requête au niveau du serveur, mais pas sûr d'un par utilisateur ou d'une limite de connexion / application. P>
Merci, ajout "SET QUERY_GOVERNOR_COST_LIMIT 600" au début de tout SQL saisi semble avoir arrêté quelque chose de trop sauvage de courir sans bouleverser les utilisateurs trop.
Tout d'abord, je vous assurerais que ces requêtes ne bloquent pas de tables (utilisez Nolock ou un niveau d'isolation de transaction de NOLOCK ou SET.
En ce qui concerne les ressources, je regarderais quelque chose comme le gouverneur de ressources. Nous utilisons cela pour tout rapport ADHOC sur notre système OLTP de production. p>
Dave Pinal Dave a une excellente entrée de blog dessus. Vous pouvez également consulter TechNet ou d'autres sites MS pour plus d'informations sur ce qu'il est et comment la configurer. P>
Créez un utilisateur qui n'aura plus ni moins de privilèges que nécessaire. P> li>
Créez des données de connexion à l'utilisateur, vous ne paragronez pas avec les administrateurs qui écriront les requêtes. P> Li>
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. P> LI> ol>
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. P>
meilleure façon d'empêcher SQL d'utiliser la mémoire / la CPU: Ne laissez pas les utilisateurs exécuter des requêtes. p>
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. P>
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. P>
Quel est le but d'une base de données si personne ne peut y accéder?
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). P>
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. P>
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 code> 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.