sql >> Databasteknik >  >> RDS >> Sqlserver

Hur ofta ska indexen byggas om i vår SQL Server-databas?

Det finns en allmän enighet om att du bör omorganisera ("defragmentera") dina index så snart indexfragmenteringen når mer än 5 (ibland 10%), och du bör bygga om dem helt och hållet när det går över 30% (åtminstone det är siffrorna jag" har hört förespråkas på många ställen).

Michelle Ufford (a.k.a. "SQL Fool") har ett automatiskt indexdefragmenteringsskript , som använder de exakta gränserna för att bestämma när ett index ska omorganiseras eller byggas om.

Se även Brad McGehees tips om att bygga om index med några bra tankar och tips om hur man hanterar indexombyggnad.

Jag använder det här skriptet här (minns inte när jag fick det här från - vem det än var:tack! Verkligen användbara saker) för att visa indexfragmenteringen på alla dina index i en given databas:

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
    


  1. Är detta en möjlig Oracle-bugg eller har jag missat något?

  2. Mysql-optimering för REGEXP

  3. Tar du den näst sista raden med bara ett urval i SQL Server?

  4. Infoga i MySQL-databas med jQuery och PHP