Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Wie oft sollten die Indizes in unserer SQL Server-Datenbank neu erstellt werden?

Es besteht allgemeiner Konsens darüber, dass Sie Ihre Indizes reorganisieren ("defragmentieren") sollten, sobald die Indexfragmentierung mehr als 5 (manchmal 10 %) erreicht, und dass Sie sie komplett neu erstellen sollten, wenn sie 30 % überschreitet (zumindest sind das die Zahlen, die ich ' habe schon an vielen Stellen befürwortet gehört).

Michelle Ufford (alias „SQL Fool“) hat ein Skript zur automatisierten Indexdefragmentierung , das genau diese Grenzwerte verwendet, um zu entscheiden, wann ein Index reorganisiert oder neu erstellt werden soll.

Siehe auch Brad McGehees Tipps zum Neuaufbau von Indizes mit einigen guten Gedanken und Tipps zum Umgang mit der Indexerneuerung.

Ich benutze dieses Skript hier (ich kann mich nicht erinnern, woher ich das bekommen habe - wer auch immer es war:vielen Dank! Wirklich hilfreiches Zeug), um die Indexfragmentierung für alle Ihre Indizes in einer bestimmten Datenbank anzuzeigen:

SELECT 
    t.NAME 'Table name',
    i.NAME 'Index name',
    ips.index_type_desc,
    ips.alloc_unit_type_desc,
    ips.index_depth,
    ips.index_level,
    ips.avg_fragmentation_in_percent,
    ips.fragment_count,
    ips.avg_fragment_size_in_pages,
    ips.page_count,
    ips.avg_page_space_used_in_percent,
    ips.record_count,
    ips.ghost_record_count,
    ips.Version_ghost_record_count,
    ips.min_record_size_in_bytes,
    ips.max_record_size_in_bytes,
    ips.avg_record_size_in_bytes,
    ips.forwarded_record_count
FROM 
    sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, 'DETAILED') ips
INNER JOIN  
    sys.tables t ON ips.OBJECT_ID = t.Object_ID
INNER JOIN  
    sys.indexes i ON ips.index_id = i.index_id AND ips.OBJECT_ID = i.object_id
WHERE
    AVG_FRAGMENTATION_IN_PERCENT > 0.0
ORDER BY
    AVG_FRAGMENTATION_IN_PERCENT, fragment_count