2009-08-13 5 views
1

Ich habe eine große Datenbank mit SQL Server 2005. Ich frage DMV sys.dm_db_index_physical_stats ab, um Indexfragmentierungsinformationen zu erhalten.Der Wiederaufbau großer SQL-Indizes ändert den Fragmentierungsprozentsatz nicht.

Ich war schockiert zu sehen, avg_fragment_size_in_percent Berichterstattung eine große Anzahl von Indizes mit sehr schlechten Fragmentierung Ebenen (99% für eine Menge von ihnen). Diese sind auf Tabellen mit nicht-trivialen Seitenzahlen (500+ Seiten auf den kleinsten Seiten).

I proceded folgendes über die schlimmsten Straftäter laufen:

ALTER INDEX ALLES AUF myTable REBUILD WITH (ONLINE = ON)

ich erneut abgefragt sys.dm_db_index_physical_stats dann aber meldet er genau das gleiche Fragmentierung vor und nach dem Index REBUILD.

Werden diese Informationen zwischengespeichert, oder mache ich etwas falsch?

+0

Können Sie uns sagen, was die Indexdefinition für diesen Index ist? Welche Felder sind enthalten (was sind ihre Datentypen)? –

+0

Sicher ... mein aktuell schlimmster Täter ist unter vielen ein Unique Identifier Index (Single Column Index), der zufällig ein Fremdschlüssel ist.Dieser zeigt 99.5991983967936% durchschnittliche Fragmentierung. – Patrick

+0

Hmm ... Ich habe diesen Post auf MSDN gefunden, der das gleiche Verhalten meldet: http://social.msdn.microsoft.com/Forums/en-US/sqldatabaseengine/thread/ff4b379c-d9e3-432d-9528- 2b3ea1cdce39 – Patrick

Antwort

0

Sind Sie sicher, dass Sie die Fragmentierung von Indizes bekommen? Es gibt mehr Objekte als nur Indizes in sys.dm_db_index_physical_stats - beispielsweise sind auch Heaps (Tabellen ohne Clustered-Indizes) enthalten.

Versuchen Sie, sich auf sys.indexes zu verbinden, um sich auf Indizes zu beschränken.

+0

Entschuldigung, ich habe das nicht erwähnt ... Ja, ich bekomme Indizes, indem ich sys.indexes an den object_ids anschließe. – Patrick

1

Alles wollten Sie schon immer über SQL Fragmentation wissen, und wie man mit ihnen umgehen zu SQLFool

finden Sie können für die Automatisierung von Index-Defragmentierung eine erstaunliche Skript und sind sehr hilfreich, wenn Sie Fragen haben.

2

Vielleicht möchten Sie den FILLFACTOR-Parameter für Indizes überprüfen - dies kann Ihre Indexfragmentierung stark beeinflussen.

Auf einem "beschäftigt" Index mit vielen Einfügen, Updates, löschen, sollten Sie in der Regel für einen Füllfaktor zwischen 70 und 90 Prozent gehen - abhängig davon, wie viele Varchar() Felder Sie haben.

Auf einem Index (insbesondere Clustered-Index), der immer größer wird (INT IDENTITY, typischerweise), können Sie FILLFACTOR 0 (oder 100 - beide gleich) verwenden und Sie werden nur Fragmentierung von Löschungen sehen.

Um FILLFACTOR angeben möchten, verwenden Sie folgende Syntax:

ALTER INDEX (indexname) 
    ON myTable REBUILD 
    WITH (ONLINE = ON, FILLFACTOR = 80) 

Hier einige weitere Informationen über Füllfaktoren und der Einfluss auf die Leistung:

Hoffe das hilft ein bisschen!

Marc

Verwandte Themen