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.