Как предотвратить ежедневную фрагментацию индекса на 99%


11

У меня есть таблица рекордов на 100 000 игроков, которая вставляется в 2 раза в день с одной записью на игрока. В конце дня фрагментация индекса для индексов в этой таблице составляет 99%. Есть ли способ предотвратить это, подправив настройки?

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
Глупый вопрос, но чтобы охватить всю основу - вы перестраиваете / реорганизуетесь каждый день?
JHFB

без TABLE DDL кто-нибудь выложит догадаюсь. Вы используете GUID в качестве первичного ключа?
SQL Learner

Я перестраиваюсь каждый день прямо сейчас, но мне интересно, смогу ли я предотвратить это каждый день, так как я могу довольно хорошо предвидеть, как развиваются данные.
olle

1
Как вы определяете уровень фрагментации? Я бы не ожидал много логической фрагментации для кластерного индекса. Однако некоторая внутренняя фрагментация вам там не нужна FILLFACTOR = 80. Это будет просто тратить пространство. Все столбцы имеют фиксированную длину, поэтому строка не может расширяться при обновлении, а вставки не могут происходить в середине таблицы. 99% кажется неожиданно высоким и для другого индекса. Сколько страниц в каждом индексе?
Мартин Смит

99% после восстановления каждый день будет действительно немного, можете ли вы показать свой sys.dm_db_index_physical_statsрезультат?
Мартин Смит

Ответы:


3

Я думаю, что вы должны попробовать более высокие FILLFACTORнастройки HighScore_RoundGroup_Nidx(например, 50 или 40). Вы можете установить FILLFACTORзначение 0 или 100, PRIMARY KEYпотому что он не должен фрагментироваться. Если это все еще происходит, FILLFACTORэто не помогает, потому что причина в том, что вновь выделенные страницы чередуются с другими вновь выделенными страницами. Это хорошо известная проблема SQL Server. Вы можете переместить этот индекс в свою собственную файловую группу, которая остановит эту проблему.


2

Возможно, вы думаете, что перестраиваете, но индекс не перестраивается, потому что индекс недостаточно велик.

Посмотрите на этот вопрос. Почему индекс REBUILD не уменьшает фрагментацию индекса?

Вы проверяли фрагментацию после перестройки? Это на самом деле дефрагментировано.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.