So verhindern Sie eine tägliche Indexfragmentierung von 99%


11

Ich habe eine Highscore-Tabelle für 100.000 Spieler, die zweimal am Tag mit einem Datensatz pro Spieler eingefügt wird. Am Ende des Tages beträgt die Indexfragmentierung für die Indizes in dieser Tabelle 99%. Gibt es eine Möglichkeit, dies zu verhindern, indem Sie die Einstellungen anpassen?

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

1
Dumme Frage, aber um alle Grundlagen abzudecken - bauen Sie jeden Tag neu auf?
JHFB

ohne TABLE DDL wird jeder Beitrag raten. Verwenden Sie GUID als Primärschlüssel?
SQL Learner

Ich baue gerade jeden Tag neu auf, aber ich frage mich, ob ich verhindern kann, dass dies jeden Tag passieren muss, da ich ziemlich gut vorhersehen kann, wie sich die Daten entwickeln.
olle

1
Wie bestimmen Sie den Fragmentierungsgrad? Ich würde für den Clustered-Index überhaupt keine logische Fragmentierung erwarten. Einige interne Fragmentierungen benötigen Sie dort jedoch nicht FILLFACTOR = 80. Es wird nur Platz verschwenden. Alle Spalten haben eine feste Länge, sodass eine Zeile beim Aktualisieren nicht erweitert werden kann und keine Einfügungen in der Mitte der Tabelle erfolgen können. 99% scheinen auch für den anderen Index unerwartet hoch zu sein. Wie viele Seiten enthält jeder Index?
Martin Smith

99% nach dem Wiederaufbau jeden Tag würde wirklich etwas gehen, können Sie Ihre sys.dm_db_index_physical_statsAusgabe zeigen ?
Martin Smith

Antworten:


3

Ich denke, Sie sollten höhere FILLFACTOREinstellungen ausprobieren HighScore_RoundGroup_Nidx(z. B. 50 oder 40). Sie können FILLFACTOR0 oder 100 für festlegen , PRIMARY KEYda es nicht fragmentiert werden soll. Wenn dies immer noch der Fall ist, FILLFACTORhilft dies nicht, da der Grund dafür ist, dass neu zugewiesene Seiten mit anderen neu zugewiesenen Seiten verschachtelt sind. Dies ist ein bekanntes SQL Server-Problem. Sie können diesen Index in eine eigene Dateigruppe verschieben, um dieses Problem zu beheben.


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.