2010-09-27 16 views
1

Je comprends maintenant qu'un index cluster contient toutes les données de ligne, pas seulement les champs d'index. J'essaie de comprendre les implications de cela en ce qui concerne la fragmentation.Est-ce que modifier un fragment de données de ligne mon index en cluster?

Disons que nous avons une table comme ceci:

create table Files 
(
    ID uniqueidentifier not null, 
    Field1 nvarchar(300) null, 
    Field2 nvarchar(300) null, 
    Field3 nvarchar(300) null, 
    Binary varbinary(max) null 
) 

permet maintenant dire que toutes ces lignes sont pleines de données, puis sur quelques-unes des premières lignes dans l'index cluster vous définissez soudainement Field1, Field2 , Field3 et Binary à null. Une implication de ceci, comme je le pense de ma façon plutôt naïve, est que l'effacement de toutes ces valeurs créera des lacunes, et l'index deviendrait fragmenté. Je suppose que les lignes sont toujours dans le bon ordre, alors est-ce vraiment la fragmentation de l'index?

Ou vous pouvez penser à l'inverse; Si elles sont toutes nulles au départ et que vous insérez des données, finissez-vous par devoir mélanger des données sur différentes pages et obtenir également une fragmentation d'index? En outre, je sais que les données LOB sont stockées dans une unité d'allocation séparée, bien que je ne sache pas quelles sont les implications de cela; cela signifie-t-il que définir Binary sur null (ou le remplir) ne devrait avoir aucun effet sur la fragmentation d'index clusterisée?

+0

Qu'est-ce que 'ID uniqueidentifier' utilisez-vous' newsequentialid' pour remplir ce champ? –

+0

C'est l'index clusterisé. Nous utilisons un générateur d'ID séquentiel dans NHibernate qui devrait faire à peu près la même chose que newsequentialid. – Gavin

Répondre

1

L'une des conséquences de cela, comme je pense à dans ma manière plutôt naïve, est que compensation toutes ces valeurs créer des lacunes, et l'indice serait se fragmenter. Je suppose que les lignes sont toujours dans le bon ordre si, est donc vraiment la fragmentation de l'index?

Oui. Vous aurez une fragmentation interne. SQL Server ne compactera pas automatiquement la page de données pour récupérer l'espace. Vous pouvez utiliser l'outil SQL Internals Viewer pour voir ceci. Ce n'est pas nécessairement une mauvaise chose en fonction de votre charge de travail. Un certain degré de fragmentation interne peut être utile pour atténuer les ci-dessous (et même ajouté délibérément par l'utilisation de FillFactor)

Ou vous pouvez penser l'autre façon ; si elles sont toutes null pour commencer avec et vous insérez des données, vous finissez par avoir à mélanger les données sur différentes pages et obtenir également l'index la fragmentation?

Oui. En supposant qu'il n'y a pas suffisamment d'espace vide sur la page pour accueillir la plus longue rangée, vous obtiendrez des divisions de page pour faire de la place pour les nouvelles données. L'ordre logique deviendra différent de l'ordre physique et vous obtiendrez une fragmentation externe.