Comment suivre les requêtes SQL qui plantent SQL Server

9

Nous avons un serveur de base de données SQL Server 2008 (il se trouve qu'il fonctionne sous MS Failover Clustering, mais je ne pense pas que ce soit pertinent ici).

Notre application exécute Hibernate pour l'accès aux bases de données, et depuis que nous avons récemment mis à niveau la version 3.1 vers la version 3.6, nous avons constaté des pannes régulières de SQL Server (toutes les 24 à 48 heures, mais parfois plus fréquemment).

Le problème spécifique en question semble être lié à la mémoire. Juste avant que le serveur ne plante (et qu'il soit ensuite redémarré automatiquement par le gestionnaire de cluster de basculement, il semble), nous obtenons une charge de ces erreurs:

Error: 701, Severity: 17, State: 130.
There is insufficient system memory in resource pool 'internal' to run this query.

aussi des messages occasionnels (mais réguliers) de

Error: 17300, Severity: 16, State: 1. (Params:). The error is printed in terse mode because there was error during formatting. Tracing, ETW, notifications etc are skipped.

Erreur: 17312, gravité: 16, état: 1. (Paramètres :). L'erreur est imprimée en mode laconique car une erreur s'est produite lors du formatage. Le traçage, l'ETW, les notifications, etc. sont ignorés.

Je reçois également des erreurs au niveau de l'application telles que

java.sql.SQLException: A time out occurred while waiting to optimize the query. Rerun the query.

puis l'erreur passionnante et peut-être instructive:

The query processor ran out of internal resources and could not produce a query plan. 
This is a rare event and only expected for extremely complex queries or queries that reference a very large number of tables or partitions. 
Please simplify the query. If you believe you have received this message in error, contact Customer Support Services for more information.

La charge sur le serveur n'a pas changé, il n'y a donc aucune raison qu'il devrait maintenant manquer de mémoire alors qu'il n'indiquait pas auparavant un problème avec les requêtes qui lui étaient envoyées.

Maintenant à la question - comment puis-je suivre les requêtes qui causent cette erreur (et donc probablement tous les problèmes)? Il semble que depuis notre mise à niveau d'Hibernate, il ait lancé d'énormes requêtes sur SQL Server, et c'est cassé. En l'occurrence, j'ai quelques idées sur ce qu'elles pourraient être, mais ce serait bien de pouvoir les retrouver.

Je peux bien sûr exécuter le profileur SQL Server, mais une fois cela fait (et produit une énorme quantité de données - c'est une base de données OLTP occupée), comment filtrer pour trouver les requêtes problématiques?

Merci!

Pete Storey
la source
1
Est-ce que tout fonctionne sur le même serveur? Autrement dit, le serveur d'applications, avec java, fonctionne-t-il également sur le serveur de base de données?
swasheck
1
En association avec la question de @ swasheck: avez-vous une valeur explicite définie pour la mémoire maximale de SQL Server? Avez-vous exclu la pression de la mémoire externe?
Mike Fal
Avez-vous essayé de regarder les traces de la boîte noire? Ils peuvent vous orienter dans la bonne direction.
datagod
Je viens de frapper cette chose, et les traces que j'ai laissées en cours d'exécution montrent une base de données inactive du point de vue de l'application.
Joshua
Utilisez-vous des recherches plein texte? En outre, quelle est l'édition exacte de la version no + du serveur SQL sur laquelle vous exécutez?
Kin Shah

Réponses:

5

Suivez les étapes décrites dans Comment utiliser la DBCC MEMORYSTATUScommande pour surveiller l'utilisation de la mémoire sur SQL Server . L'action corrective dépendra de vos constatations. Vous pouvez également lire Comment identifier les goulots d'étranglement de la mémoire Microsoft SQL Server qui est plus accessible.

Un mot d'avertissement cependant: il est peu probable que vous trouviez des requêtes individuelles à blâmer. La recherche des problèmes de mémoire est plus subtile que cela. Gardez à l'esprit que lorsque vous manquez de ressources et qu'une requête génère une erreur de mémoire insuffisante, il se peut que la requête qui génère l'erreur soit uniquement la victime , pas le coupable.

Remus Rusanu
la source
Merci - j'ai déjà regardé ceux-ci, mais le problème est que le serveur semble fonctionner correctement et puis soudainement, il ne manque pas progressivement de mémoire. Il n'est pas clair non plus, d'après ce que je peux trouver en ligne, que l'erreur "La mémoire système est insuffisante dans le pool de ressources" interne "pour exécuter cette requête." signifie en fait - quel est le pool de ressources internes en ce qui concerne les résultats de DBCC MEMORYSTATUS?
S'agit-il d'un serveur de développement? Si oui, pourriez-vous rétrograder vers Hibernate 3.1 pour vérifier que le problème disparaît? Vous disposez de deux lignes de demande initiales et vous devez essayer d'en éliminer une, soit SQL Server a des limites de mémoire définies et les dépasse, soit une autre partie du système consomme de la mémoire et SQL Server est pressé. Profil du système autour des heures de l'accident pour déterminer ce qui se passe.
epo
0

Semble que vous voulez aller pour la Extended Eventsconfiguration en utilisant les événements query_memory_grant_xxxxx.

C'est la meilleure option pour vous de journaliser les informations et le moteur SQL stocké hors de taille que vous pouvez lire à tout moment (vous pouvez également regarder des données en direct), les informations stockées ne seraient pas effacées lors du redémarrage du serveur contrairement à DMVs

Étapes de configuration rapide ..

Shekar Kola
la source