Comment éviter une fragmentation quotidienne de l'indice de 99%

11

J'ai un tableau des meilleurs scores pour 100.000 joueurs qui est inséré 2 fois par jour avec un record par joueur. À la fin de la journée, la fragmentation des index pour les index de ce tableau est de 99%. Existe-t-il un moyen d'empêcher cela en modifiant les paramètres?

CREATE TABLE HighScore(
    [id] [int] IDENTITY(1,1) NOT NULL,
    [user] [int] NULL,
    [player] [int] NULL,
    [round] [tinyint] NULL,
    [group] [int] NULL,
    [rank] [int] NULL,
    [delta] [int] NULL,
    [roundpoints] [int] NULL,
    [totalpoints] [int] NULL,
PRIMARY KEY CLUSTERED 
(
    [id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON, FILLFACTOR = 80) ON [PRIMARY]
) ON [PRIMARY]


CREATE NONCLUSTERED INDEX [HighScore_RoundGroup_Nidx] ON .[HighScore] 
(
    [round] ASC,
    [group] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON, FILLFACTOR = 80) ON [PRIMARY]
GO
olle
la source
1
Question idiote, mais pour couvrir toutes les bases - reconstruisez-vous / réorganisez-vous tous les jours?
JHFB
sans TABLE DDL, quiconque postera devinera. Utilisez-vous le GUID comme clé primaire?
SQL Learner
Je reconstruis tous les jours en ce moment, mais je me demande si je peux empêcher que cela ne se produise tous les jours, car je peux assez bien anticiper sur l'évolution des données.
Olle
1
Comment déterminez-vous le niveau de fragmentation? Je ne m'attendrais pas du tout à une fragmentation logique pour l'index clusterisé. Une certaine fragmentation interne cependant, vous n'en avez pas besoin FILLFACTOR = 80. Cela ne fera que perdre de l'espace. Toutes les colonnes sont de longueur fixe, donc une ligne ne peut pas se développer lors de la mise à jour et les insertions ne peuvent pas se produire au milieu du tableau. 99% semble également inattendu pour l'autre indice. Combien de pages y a-t-il dans chaque index?
Martin Smith
99% après la reconstruction chaque jour irait vraiment, pouvez-vous montrer votre sys.dm_db_index_physical_statssortie?
Martin Smith

Réponses:

3

Je pense que vous devriez essayer des FILLFACTORréglages plus élevés HighScore_RoundGroup_Nidx(par exemple 50 ou 40). Vous pouvez définir FILLFACTOR0 ou 100 pour le PRIMARY KEYcar il ne devrait pas se fragmenter. Si c'est toujours le cas, cela FILLFACTORn'aide pas car la raison est que les pages nouvellement allouées s'entrelacent avec d'autres pages nouvellement allouées. Il s'agit d'un problème SQL Server bien connu. Vous pouvez déplacer cet index dans son propre groupe de fichiers, ce qui arrêterait ce problème.

usr
la source
2

Vous pensez peut-être que vous reconstruisez, mais l'index n'est pas reconstruit car l'index n'est pas assez grand.

Jetez un œil à cette question Pourquoi l'indice REBUILD ne réduit pas la fragmentation de l'indice?

Avez-vous vérifié la fragmentation après la reconstruction? Est-il réellement défragmenté?

Tom V - essayez topanswers.xyz
la source