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

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.


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.