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
olle
quelle
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.

usr
quelle
2

Vielleicht denken Sie, Sie werden neu erstellt, aber der Index wird nicht neu erstellt, weil der Index nicht groß genug ist.

Schauen Sie sich diese Frage an. Warum reduziert Index REBUILD die Indexfragmentierung nicht?

Haben Sie die Fragmentierung nach dem Wiederaufbau überprüft? Ist es tatsächlich defragmentiert.

Tom V - versuchen Sie topanswers.xyz
quelle