Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Réduire la fragmentation des tables SQL Server sans ajouter/supprimer un index cluster ?

Problème

Soyons clairs, car il s'agit d'un problème courant, un problème sérieux pour toutes les entreprises utilisant SQL Server.

Ce problème, et la nécessité de CREATE CLUSTERED INDEX, sont mal compris.

Convenu qu'il vaut mieux avoir un index clusterisé permanent que de ne pas en avoir. Mais ce n'est pas le sujet, et cela mènera de toute façon à une longue discussion, alors laissons cela de côté et concentrons-nous sur la question publiée.

Le fait est que vous avez une fragmentation substantielle sur le Heap . Vous continuez à l'appeler une "table", mais il n'y a rien de tel au niveau du stockage physique des données ou du niveau DataStructure. Une table est un concept logique et non physique. Il s'agit d'une collection de DataStructures physiques. La collection est l'une des deux possibilités :

  • Tas
    plus tous les index non clusterisés
    plus les chaînes Texte/Image

  • ou un index clusterisé
    (élimine le Heap et un Index non clusterisé)
    plus tous les index non clusterisés
    plus les chaînes Texte/Image.

Les tas sont très fragmentés ; plus il y a d'insertions/suppressions/mises à jour intercalées (aléatoires), plus la fragmentation est importante.

Il n'y a aucun moyen de nettoyer le tas tel quel. MS ne fournit pas d'installation (d'autres fournisseurs le font).

Solution

Cependant, nous savons que Create Clustered Index réécrit et réorganise complètement le tas. La méthode (pas une astuce) consiste donc à créer un index clusterisé uniquement dans le but de défragmenter le tas , et déposez-le ensuite. Vous avez besoin d'espace libre dans la base de données de table_size x 1,25.

Pendant que vous y êtes, par tous les moyens, utilisez FILLFACTOR, pour réduire le futur fragmentation. Le tas prendra alors plus d'espace alloué, permettant de futures insertions, suppressions et extensions de lignes en raison des mises à jour.

Remarque

  1. Notez qu'il existe trois Niveaux de fragmentation ; cela ne concerne que le niveau III, la fragmentation au sein du tas, qui est causée par l'absence d'un index clusterisé

  2. En tant que tâche distincte, à un autre moment, vous souhaiterez peut-être envisager la mise en œuvre d'un index clusterisé permanent, qui élimine complètement la fragmentation... mais cela est distinct du problème affiché.

Réponse au commentaire

Pas assez. Je n'appellerais pas cela une "limitation".

  1. La méthode que j'ai donnée pour éliminer la fragmentation dans le tas consiste à créer un index clusterisé, puis à le supprimer. C'est à dire. temporairement, dont le seul but est de corriger la Fragmentation.

  2. L'implémentation d'un index clusterisé sur la table (en permanence) est une bien meilleure solution, car elle réduit globalement Fragmentation (la structure de données peut toujours être fragmentée, reportez-vous aux informations détaillées dans les liens ci-dessous), ce qui est bien inférieur à la fragmentation qui se produit dans un tas.

    • Chaque table d'une base de données relationnelle (à l'exception des tables "pipe" ou "file d'attente") doit avoir un index clusterisé, afin de tirer parti de ses divers avantages.

    • L'index clusterisé doit être sur des colonnes qui distribuent les données (en évitant les conflits INSERT), ne jamais être indexé sur une colonne croissante de manière monotone, telle que Record ID , qui garantit un INSERT Hot Spot dans la dernière page.

Dans MS SQL et Sybase ASE, il existe trois Niveaux de Fragmentation, et au sein de chaque Niveau, plusieurs Types différents . Gardez à l'esprit que lorsqu'il s'agit de fragmentation, nous devons nous concentrer sur les DataStructures, et non sur les tables (une table est une collection de DataStructures, comme expliqué ci-dessus). Les niveaux sont :

  • Niveau I • Extra-DataStructure
    En dehors de la DataStructure concernée, à travers ou au sein de la base de données.

  • Niveau II • Structure de données
    Au sein de la DataStructure concernée, au-dessus des Pages (sur toutes les Pages)
    Il s'agit du Niveau le plus fréquemment adressé par les DBA.

  • Niveau III • Page
    Au sein de la DataStructure concernée, au sein des Pages

Ces liens fournissent des détails complets sur la fragmentation. Ils sont spécifiques à Sybase ASE, cependant, au niveau structurel, les informations s'appliquent à MS SQL.

Notez que la méthode que j'ai donnée est de niveau II, elle corrige la fragmentation de niveau II et III.