web-dev-qa-db-fra.com

Niveau de fragmentation pour les tas

J'utilise actuellement des scripts fournis par M. Ola Hallengren pour l'exécution du travail de maintenance et de retard, je vous ai remarqué qu'il existe de nombreux tables (tas) Le niveau de fragmentation est alarmement élevé et doit être examiné et prendre des mesures. J'ai vérifié FAQ sur le site et semble que son script ne supporte pas la reconstruction des tas. J'ai utilisé ci-dessous la requête pour trouver le niveau de fragmentation:

SELECT dbschemas.[name] as 'Schema', 
dbtables.[name] as 'Table', 
dbindexes.[name] as 'Index',
indexstats.alloc_unit_type_desc,
indexstats.avg_fragmentation_in_percent,
indexstats.page_count
FROM sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL, NULL, NULL) AS indexstats
INNER JOIN sys.tables dbtables on dbtables.[object_id] = indexstats.[object_id]
INNER JOIN sys.schemas dbschemas on dbtables.[schema_id] = dbschemas.[schema_id]
INNER JOIN sys.indexes AS dbindexes ON dbindexes.[object_id] = indexstats.[object_id]
AND indexstats.index_id = dbindexes.index_id
WHERE indexstats.database_id = DB_ID() and dbindexes.name is null
ORDER BY page_count desc, indexstats.avg_fragmentation_in_percent desc

Ma candidature est prise en charge par le fournisseur et je communique avec eux pour modifier ces tas en tables et créer Index cluster mais il n'a pas cédé de résultat significatif Pourtant, comme ils ont défini la clé principale en tant qu'index unique non cluster et fait également partie de la clé étrangère, il est donc nécessaire de changer à de nombreux niveaux avant de faire des modifications. Tout d'abord, il m'a fallu plusieurs jours pour moi Expliquez la différence entre l'index en cluster et la clé primaire avec un index unique.

J'ai également suivi le Tweaks suggéré par M. Brent Ozar pour avoir modifié les valeurs par défaut du script fourni par M. Ola Hallengren pour l'optimisation de l'indice afin de le rendre plus efficace, mais je n'ai trouvé aucun détail de reconstruction de tas.

Selon ma compréhension, la fragmentation du tas peut être traitée de deux manières comme décrit ici :

  1. Pour créer une index en cluster sur la table et déposez-la - cela effacerait toute la fragmentation et reconstruisez également tout l'indice non groupé, mais ce serait le temps et l'E/S consommant.
  2. Reconstruire le tas - cela effacerait également la fragmentation et reconstruire tout l'index non groupé une partie de la reconstruction de table.

Je ne peux pas aller pour l'option 1 car je ne suis pas au courant des colonnes où l'indice en clustered peut être créé et cela pourrait également prendre plus de temps que l'option 2.

Je cherche la possibilité d'implémenter l'option 1 dans les scripts de OLA Hallengren ou une méthode alternative pour la manipulation de cela. Aussi à ajouter, je voudrais reconstruire mes tas que lorsque la taille du tas est supérieure à 10 000 pages et que le niveau de fragmentation est supérieur à 80.

J'utilise Microsoft SQL Server 2014 SP3 Enterprise Edition.

En tant que DBA - Je ne préfère pas avoir des tas dans ma base de données, car il s'agit d'une application soutenue du fournisseur et, car elles ont déjà défini une clé primaire en tant qu'index unique et ces clés sont des clés étrangères, il est très difficile de les changer en regroupement en raison de Références ainsi que la probabilité de temps d'arrêt.

EDIT: J'ai traversé le link fourni par M. Erik Darling et je peux confirmer que j'ai le nombre de tas avec des enregistrements transférés ou des suppressions dans les bases de données. Maintenant, je suis de retour au point d'où j'avais commencé, c'est-à-dire avec ces deux options. Comme je l'ai mentionné plus tôt, la création d'un indice en cluster est très difficile dans mon scénario et nécessitera au moins des mois (étant optimiste) avec l'aptitude des temps d'arrêt compte tenu de la structure de clé étrangère complexe. Besoin de conseils sur la reconstruction des tas et un effet secondaire possible.

3
Learning_DBAdmin

Les tas ont quelques défis particuliers que vous ne pouvez pas expérimenter avec des index clusters:

  • Enregistrements transférés
  • Pages captives

Je suggérerais d'exécuter sp_blitzindex Contre votre base de données pour savoir si l'une de ces choses se produit avec vos tas. Sinon, alors laissez-les seuls. S'ils le sont, vous devrez peut-être envisager de les reconstruire.

À ce stade, vous ne pouvez pas réorganiser une table de tas et la reconstruction d'une table de démarrage reconstruirea également tous les index non clusters. Il peut être moins cher de les déposer, reconstruire la table du tas, puis recréer les index non clusters.

Vous pouvez en savoir plus sur ce truc ici:

9
Erik Darling