Domanda

Da quello che ho capito su indice di frammentazione, questo non dovrebbe essere possibile. I casi che ho trovato nelle mie basi di dati sono non-cluster.

Esempio:

ALTER TABLE [dbo].[ClaimLineInstitutional] ADD  CONSTRAINT [PK_ClaimLineInsitutional]  
PRIMARY KEY NONCLUSTERED 
(
    [ClaimLineInstitutionalID] ASC
)WITH (PAD_INDEX  = ON, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF,   
IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON,    
FILLFACTOR = 100) ON [PRIMARY]

Aggiornamento:

sto inviando una richiesta dm_db_index_physical_stats.avg_fragmentation_in_percent, quindi credo che sia la frammentazione fisica che sto vedendo.

È stato utile?

Soluzione

Aggiornamenti sui dati già ci provoca file da spostare e puntatori avanti aggiunto

In questo test, possiamo ottenere il 65% frammentazione 115k righe densamente

CREATE TABLE #FragTest (
    FragTestID int NOT NULL IDENTITY PRIMARY KEY,
    SomeString varchar(4100) NULL
    );

INSERT #FragTest (SomeString) VALUES ('a');
GO
INSERT #FragTest (SomeString)
    SELECT F1.SomeString FROM #FragTest F1 CROSS JOIN #FragTest F2;
GO 4
INSERT #FragTest (SomeString) SELECT F1.SomeString FROM #FragTest F1    
GO 6

SELECT COUNT(*) FROM #FragTest

SELECT object_id, avg_fragmentation_in_percent, page_count
FROM sys.dm_db_index_physical_stats(2, OBJECT_ID('tempdb..#FragTest'), NULL, NULL, NULL);

UPDATE #FragTest
SET SomeString = REPLICATE('b', 4100)
WHERE FragTestID < 10000 AND FragTestID % 3 = 0

SELECT object_id, avg_fragmentation_in_percent, page_count
FROM sys.dm_db_index_physical_stats(2, OBJECT_ID('tempdb..#FragTest'), NULL, NULL, NULL);

UPDATE #FragTest
SET SomeString = REPLICATE('c', 4100)
WHERE FragTestID < 10000 AND FragTestID % 3 = 1

SELECT object_id, avg_fragmentation_in_percent, page_count
FROM sys.dm_db_index_physical_stats(2, OBJECT_ID('tempdb..#FragTest'), NULL, NULL, NULL);

UPDATE #FragTest
SET SomeString = REPLICATE('d', 4100)
WHERE FragTestID < 10000 AND FragTestID % 3 = 2

SELECT object_id, avg_fragmentation_in_percent, page_count
FROM sys.dm_db_index_physical_stats(2, OBJECT_ID('tempdb..#FragTest'), NULL, NULL, NULL);

Modifica, mi dispiace, il browser guai

Se si cambia la replica mezzo al 2000 si ottiene <5% alla fine. Ciò accade perché c'è spazio libero da file spostati nel primo aggiornamento

Altri suggerimenti

frammentazione logica si verifica quando la pagina logicamente successiva è diversa dalla pagina successiva fisicamente.

Nel caso del livello foglia di un indice con una chiave monotona crescente questo può accadere se allocazioni extent per l'indice diventare intercalati con le dotazioni misura per altri oggetti.

Anche senza questo una piccola quantità di frammentazione ne conseguirà per effetto dei primi allocazioni di pagine provenienti da extent misti e pagine per i diversi livelli di indice essendo intercalati nelle stesse estensioni.

(Edit: Più dell'effetto corso di aggiornamenti e divisioni di pagina come da @ di gbn risposta)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a dba.stackexchange
scroll top