Jak zapobiec codziennej fragmentacji indeksu 99%

11

Mam tabelę najlepszych wyników dla 100 000 graczy, która jest wstawiana 2 razy dziennie z jednym rekordem na gracza. Na koniec dnia fragmentacja indeksów dla indeksów w tej tabeli wynosi 99%. Czy można temu zaradzić, modyfikując ustawienia?

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
źródło
1
Głupie pytanie, ale na wszelki wypadek - czy przebudowujesz / reorganizujesz każdego dnia?
JHFB
bez DDL TABELI każdy zgadnie. Czy używasz GUID jako klucza podstawowego?
SQL Learner
Obecnie odbudowuję każdego dnia, ale zastanawiam się, czy mogę temu zapobiec, ponieważ mogę dość dobrze przewidzieć rozwój danych.
olle
1
Jak określasz poziom fragmentacji? Nie spodziewałbym się wcale dużej logicznej fragmentacji indeksu klastrowego. Jednak fragmentacja wewnętrzna nie jest FILLFACTOR = 80tam potrzebna . To tylko zmarnuje miejsce. Wszystkie kolumny mają ustaloną długość, więc wiersz nie może rozwinąć się podczas aktualizacji, a wstawki nie mogą występować na środku tabeli. 99% wydaje się nieoczekiwanie wysokie również dla drugiego indeksu. Ile stron jest w każdym indeksie?
Martin Smith
99% po przebudowie każdego dnia naprawdę będzie trochę, czy możesz pokazać swoją sys.dm_db_index_physical_statswydajność?
Martin Smith,

Odpowiedzi:

3

Myślę, że powinieneś wypróbować wyższe FILLFACTORustawienia HighScore_RoundGroup_Nidx(np. 50 lub 40). Możesz ustawić FILLFACTORna 0 lub 100, PRIMARY KEYponieważ nie powinno się fragmentować Jeśli nadal tak jest, FILLFACTORnie pomaga, ponieważ przyczyną jest to, że nowo przydzielone strony przeplatają się z innymi nowo przydzielonymi stronami. Jest to dobrze znany problem z programem SQL Server. Możesz przenieść ten indeks do własnej grupy plików, co zatrzymałoby ten problem.

usr
źródło
2

Może myślisz, że przebudowujesz, ale indeks się nie odbudowuje, ponieważ indeks nie jest wystarczająco duży.

Spójrz na to pytanie Dlaczego indeks REBUILD nie zmniejsza fragmentacji indeksu?

Czy sprawdziłeś fragmentację po przebudowie? Czy to jest faktycznie defragmentowane.

Tom V - spróbuj topanswers.xyz
źródło