Nous résolvons un problème de longue date avec un fournisseur. Leur logiciel a tendance à geler et à cesser de fonctionner une ou deux fois par semaine, ce qui provoque des perturbations majeures de notre fonctionnement. Ils n'ont pas pu en déterminer la cause malgré le fait que nous leur ayons envoyé de nombreux Go de journaux et sauvegardes de la base de données. Dernièrement, ils ont commencé à suggérer que les problèmes étaient liés à notre maintenance et peut-être pas à leur logiciel (malgré l'absence de longues requêtes en cours, la pression CPU / RAM / IO ou même des blocages lorsque les problèmes se produisent). Ils disent en particulier que nos indices sont un problème.
Leur outil préféré à utiliser est DBCC showcontig malgré mon argumentation que la chose est déconseillée par MS. Ils sont obsédés par la densité de numérisation et la fragmentation de l'étendue en particulier. Pour supprimer l'excuse, j'ai institué une maintenance nocturne agressive qui reconstruit les index avec une densité de balayage <90% ou une fragmentation> 10%. Cela les a quelque peu rejetés du train de densité de balayage, mais ils restent fixés sur la fragmentation de l'étendue. DBCC showcontig montre une fragmentation étendue, même sur un index qui a été reconstruit quelques heures auparavant. Voici les résultats de dbcc_showcontig et sys.dm_db_index_physical_stats pour une table qu'ils ont désignée comme un "problème possible".
DBCC SHOWCONTIG
- Pages numérisées ................................: 1222108
- Étendues numérisées ..............................: 152964
- Commutateurs d'extension ..............................: 180904
- Moy. Pages par étendue ........................: 8.0
- Densité de numérisation [Meilleur nombre: nombre réel] .......: 84,44% [152764: 180905]
- Fragmentation de l'analyse logique ..................: 3,24%
- Fragmentation de l'analyse étendue ...................: 35,97%
- Moy. Octets libres par page .....................: 692,5
- Moy. Densité de page (pleine) .....................: 91,44%
sys.dm_db_index_physical_stats
index_type_desc alloc_unit_type_desc Avg_fragmentation_in_percent page_count
CLUSTERED INDEX IN_ROW_DATA 3.236803129 1222070
NONCLUSTERED INDEX IN_ROW_DATA 0.680074642 48230
NONCLUSTERED INDEX IN_ROW_DATA 0.093237195 48264
NONCLUSTERED INDEX IN_ROW_DATA 0.03315856 48253
NONCLUSTERED INDEX IN_ROW_DATA 0.194653248 48291
NONCLUSTERED INDEX IN_ROW_DATA 0.393480436 58961
NONCLUSTERED INDEX IN_ROW_DATA 0.23622292 64346
NONCLUSTERED INDEX IN_ROW_DATA 0.041445623 48256
NONCLUSTERED INDEX IN_ROW_DATA 0.701172007 59044
NONCLUSTERED INDEX IN_ROW_DATA 0.216397724 53605
Dois-je me préoccuper de mes index? Celui ci-dessus n'est pas atypique. Le MS DMV préféré semble montrer qu'il va très bien, mais le fournisseur est bloqué sur cette fragmentation de 35,97%. Je soupçonne que ce sont juste eux qui essaient désespérément de trouver quelque chose pour blâmer leurs problèmes logiciels, mais si j'ai un problème réel, je veux essayer de le résoudre.
la source
Réponses:
Oh, c'est vrai, je pense avoir déjà entendu cette blague. Ça ne va pas quelque chose comme:
Hmm. Eh bien, croyez-moi, c'est beaucoup plus drôle dans l'original hongrois.
Mais encore, pourquoi la réaction initiale de tant de gens, lorsqu'un système ralentit, suppose-t-elle simplement qu'il s'agit de la base de données? Comme si le code d'application ne pouvait pas être horriblement écrit, ou simplement avoir des bugs? Les choses ralentissant pourraient certainement être la base de données. Mais simplement verrouiller / geler? Cela ne me semble pas être un problème spécifique à la base de données.
Ce qu'il fait son est peut - être comme un code d'application qui ne libère pas correctement les ressources externes (sockets réseau, poignées de système de fichiers, etc.). Si nous parlons d'une application .NET, les développeurs oublient parfois correctement les
Dispose()
objets qui ont associé des ressources non gérées. Par exemple: ouvrir unSqlConnection
objet. Vous n'en obtenez pas une quantité infinie. Donc, s'ils veulent regarder dans la base de données, alors très bien. Mais peut-être que la prochaine fois que le système se bloquera, jetez un coup d'œil à:Si leur code ne libère pas les connexions, alors il devrait être assez évident s'il y a trop de connexions, surtout si beaucoup d'entre elles ont de longues périodes d'inactivité.
Et peut-être que ce truc a déjà été vérifié et tout simplement pas divulgué dans la question. Mais il me semble plutôt étrange qu'ils soient si concentrés sur les index et la fragmentation. Bien sûr, il y a des problèmes de reniflage de paramètres qui font parfois qu'une, ou peut-être quelques-unes, les procédures stockées prennent VRAIMENT LONG, mais qui bloquent une application entière? Je ne l'achète pas, surtout si vous ne voyez pas de requête en cours d'exécution et occupant beaucoup de ressources ou de verrous ou de temps lorsque cela se produit.
Alors, "à qui faire confiance?" Certainement pas ce vendeur ;-).
la source
Une chose que vous pouvez vérifier pour voir si vos index doivent être réorganisés ou reconstruits est d'utiliser cette requête:
Remplacez
@strBD
paryour database name
.Selon les résultats, veuillez procéder comme indiqué dans https://msdn.microsoft.com/en-us/library/ms189858(v=sql.110).aspx . Ce lien concerne la version 2012 de SQL Server; veuillez sélectionner la version appropriée pour procéder correctement.
Comme quelqu'un l'a commenté, il vaut mieux informer votre fournisseur de cette révision et correction, au-delà du «problème de fragmentation». Peut-être identifier certaines requêtes et plans d'exécution avec une capture SQL Profiler.
la source
identifying some queries and execution plans with a SQL Profiler capture.
oh .. s'il vous plaît .. ne capturez pasexec plans
avec Profiler. Il peut mettre votre serveur à genoux. Regardez plutôt les données DMV.