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.