Nous avons une base de données Active OLTP 40 Go sur SQL Server 2014 SP1. Les requêtes se trouvent lentement avec les attentes IO_Complettion, la longueur de la file d'attente de disque hausse à 900 et SQL Server cesse de répondre. Ce que nous avons essayé:
Redémarrez l'instance et avec une minute, cela commence à se comporter de la même manière.
Après le deuxième redémarrage, nous avons modifié la taille initiale de chaque fichier de données Tempdb (il y a 16 fichiers de données créés) et commence à fonctionner correctement.
Remarque: nous utilisons des variables de table pour des ensembles de résultats intermédiaires. Ces ensembles de résultats sont très petits.
Cela s'est passé deux fois par mois. Chaque fois que j'ajoute un peu d'espace manuellement aux fichiers de données, alors il commence à fonctionner normalement. La chose la plus intéressante est que la même configuration (même matériel, le même dossier et la même configuration des fichiers, la même charge de travail) que nous avons sur SQL Server 2008 R2 et et SQL Server 2012 fonctionne bien.
Veuillez nous aider à trouver une solution permanente.
La taille initiale de tous les fichiers de données est la même de 1000 Mo, le courant est de 1500 Mo chacun. Tous sont identiques. Autogrowth est de 100 Mo pour chacun. Avant cela, nous étions confrontés à la discorde des pages de PFS et de GAM et nous avons augmenté à 16 et résolus. Les deux drapeaux de trace 1117 et 1118 sont activés. 24 noyaux sur 2 nœuds numa. Tous les datafiles sont sur le même volume. Disque simple, pas de san.
L'instance est sur une machine physique. Les requêtes avec des variables de table et des requêtes avec des jointures de hachage sont la plus génératrice des attentes IO_Completion.
La réponse détaillée de WBOB nous a poussé à rechercher plus en détail. Comment l'avons-nous manqué avant:
Autogrow of Fichier 'Templog' dans la base de données 'TEMPDB' a été annulé par l'utilisateur ou expiré après 7704 millisecondes. Utilisez la base de données Alter pour définir une valeur de fileGrowth plus petite pour ce fichier ou définir explicitement une nouvelle taille de fichier.
Nous avons trouvé dans le journal quand ce type de problème se produit. Nous ouvrons TEMPDB pour séparer le lecteur rapide.
Je pense que vous avez surprené votre TEMPDB et vous trouverez une inadéquation entre la CPU du serveur et la configuration du disque, mais collectons quelques informations supplémentaires:
EXEC sp_configure 'max degree of parallelism'
). Si les processeurs sont hex-noyau, le serveur MaxDop doit être au plus 6 (selon tel ), ou sans subissablement plus bas sur un OLTP Système. Je garde normalement mon TEMPDB Fichiers en ligne avec mon serveur DOP à un maximum de 8 mais nous allons venir sur cela.EXEC sp_configure 'max server memory (MB)'
).Hash se joint à des variables de table dans un OLTP System? Cela suggère un manque d'indexation sur la variable de table, la table principale ou les deux. Vous déclarez vos variables de table comme celle-ci (sans index)?
DECLARE @t TABLE ( x INT )
Ne lésinez pas sur la définition de la variable de table, même s'il contient de petits résultats. Il est toujours préférable de donner à l'optimiseur autant d'informations que possible, il est donc explicite avec la nullabilité, l'unicité, que l'indice soit ou non groupé/non cluster, par exemple
DECLARE @t TABLE ( x INT PRIMARY KEY )
DECLARE @u TABLE ( x INT PRIMARY KEY NONCLUSTERED, u INT NOT NULL UNIQUE CLUSTERED, z INT NOT NULL UNIQUE, a CHAR(1) NULL ) -- not sure why you would do this but you can
DECLARE @v TABLE ( x INT NOT NULL, y INT NOT NULL, PRIMARY KEY ( x, y ) ) -- multi-column primary key
L'affichage du plan d'exécution aidera à diagnostiquer ceci.
Vérifiez le code prévention de la mise en cache variable de table selon ici , ICI . Je pense que Dynamic SQL et Proc exécuté avec recompilation sont les seuls à affecter les variables de la table.
DECLARE @u TABLE ( x INT )
INSERT @u
EXEC('DECLARE @t TABLE ( x INT ); INSERT INTO @t VALUES ( 1 ); SELECT x FROM @t;' )
SELECT *
FROM @u
Vérifiez le journal SQL Server (Explorateur d'objets> Gestion> SQL Server Logs) pour les messages, par exemple IO AVERTISSEMENTS.
Cependant, oubliez ce que nous pensons que nous savons; Créez une plate-forme de test qui reproduit votre problème et expérimentez la réduction du nombre de fichiers temporaires ... Commencez à 1, 2, 4, 6, etc. Recueillir les informations, pour prendre une décision fondée sur des preuves. Maintenant, c'est plus difficile que votre problème semble intermittent et que vous ne pourrez peut-être pas gâcher avec votre configuration tempdb, mais c'est comme ça que je voudrais aborder cela.
Bonne chance. Fais nous savoir comment tu reussis.