Come prevenire la frammentazione giornaliera dell'indice del 99%


11

Ho una tabella dei punteggi migliori per 100.000 giocatori che viene inserita 2 volte al giorno con un record per giocatore. Alla fine della giornata la frammentazione dell'indice per gli indici in quella tabella è del 99%. C'è un modo per impedirlo modificando le impostazioni?

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
Domanda sciocca, ma per coprire tutte le basi: stai ricostruendo / riorganizzando ogni giorno?
JHFB,

senza TABELLA DDL chiunque posterà indovinerà. Stai usando GUID come chiave primaria?
SQL Learner,

Sto ricostruendo ogni giorno in questo momento ma mi chiedo se posso impedire che ciò accada ogni giorno poiché posso anticipare abbastanza bene su come i dati si evolvono.
olle,

1
Come stai determinando il livello di frammentazione? Non mi aspetterei molta frammentazione logica per l'indice cluster. Qualche frammentazione interna, tuttavia, non è necessario FILLFACTOR = 80lì. Sprecherà solo spazio. Tutte le colonne hanno una lunghezza fissa, quindi una riga non può espandersi durante l'aggiornamento e gli inserimenti non possono avvenire nel mezzo della tabella. Il 99% sembra inaspettatamente alto anche per l'altro indice. Quante pagine ci sono in ciascun indice?
Martin Smith,

Il 99% dopo la ricostruzione ogni giorno sarebbe davvero andato un po ', puoi mostrare il tuo sys.dm_db_index_physical_statsoutput?
Martin Smith,

Risposte:


3

Penso che dovresti provare FILLFACTORimpostazioni più alte su HighScore_RoundGroup_Nidx(ad esempio 50 o 40). È possibile impostare FILLFACTORsu 0 o 100 PRIMARY KEYperché non dovrebbe frammentarsi. Se continua a funzionare, FILLFACTORnon aiuta perché il motivo è che le pagine appena allocate si intersecano con altre pagine appena allocate. Questo è un noto problema di SQL Server. È possibile spostare questo indice nel proprio filegroup per arrestare questo problema.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.