Як запобігти щоденній фрагментації індексу на 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

без ТАБЛИЧНОГО DDL хтось, хто публікує, здогадається. Ви використовуєте GUID як основний ключ?
SQL Learner

Я зараз будую щодня, але мені цікаво, чи можу я запобігти тому, щоб це відбувалося щодня, оскільки я можу передбачити досить добре те, як розвиваються дані.
olle

1
Як Ви визначаєте рівень фрагментації? Я б не очікував особливої ​​логічної фрагментації для кластерного індексу. Хоча якась внутрішня фрагментація вам FILLFACTOR = 80там не потрібна . Це просто витратить місце. Усі стовпці мають фіксовану довжину, тому рядок не може розширюватися під час оновлення, а вставки не можуть відбуватися в середині таблиці. 99% здається несподівано високим і для іншого показника. Скільки сторінок у кожному індексі?
Мартін Сміт

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

Відповіді:


3

Я думаю, ви повинні спробувати більш високі FILLFACTORналаштування HighScore_RoundGroup_Nidx(наприклад, 50 або 40). Ви можете встановити FILLFACTOR0 або 100 для PRIMARY KEYтому, що він не повинен фрагментуватися. Якщо він все-таки є, FILLFACTORне допомагає, оскільки причина полягає в тому, що щойно виділені сторінки переплітаються з іншими щойно виділеними сторінками. Це добре відома проблема SQL Server. Ви можете перемістити цей індекс у власну файлову групу, яка зупинить цю проблему.


2

Можливо, ви думаєте, що ви відбудовуєтесь, але індекс не відбудовується, оскільки індекс недостатньо великий.

Погляньте на це питання Чому індекс REBUILD не зменшує фрагментацію індексу?

Ви перевірили фрагментацію після відновлення? Це насправді дефрагментовано.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.