Il modo più efficiente per ottenere statistiche su un intero database di SQL Server


8

Quello che sto cercando di fare è rivedere i nostri database e bloccare tutte le auto-shrinkimpostazioni, nonché ottenere un handle su quali database / tabelle sono altamente frammentati.

Esiste un particolare script che posso eseguire per avere una buona idea per database?

So di poter eseguire quanto segue a livello di tabella (almeno SQL Server 2005):

DBCC SHOWCONTIG ('DB.TABLE');

Ma cosa posso eseguire per mostrarmi tutte le tabelle in un database?

Grazie

Risposte:


6

Per verificare la frammentazione nel 2005/2008 è possibile utilizzare il seguente script. È necessario impostare i valori @DBe @Table. Se li definisci come NULLallora, verrà eseguito su tutti i database e / o tutte le tabelle. Se si esegue un singolo db, assicurarsi di eseguirlo nel contesto di quel DB ( USE MyDB).

SELECT 
    object_name(IPS.object_id) AS [Table Name], 
    SI.name AS [Index Name], 
        CASE IPS.Index_type_desc
            WHEN 'CLUSTERED INDEX' THEN 'Clustered'
            ELSE 'Non-Clustered'
        END AS 'Index Type', 
    IPS.avg_fragmentation_in_percent as 'Avg Fragmentation (%)', 
    IPS.avg_fragment_size_in_pages as 'Avg Frag Size (pages)',
    IPS.page_count as 'Page Count', 
    IPS.forwarded_record_count as 'Forwarded Records',
    --IPS.avg_page_space_used_in_percent as 'Avg Page Space Used (%)', 
    --IPS.record_count as 'Record Count', 
    --IPS.ghost_record_count as 'Ghost Record Count',
    IPS.fragment_count as 'Fragment Count'
FROM sys.dm_db_index_physical_stats
    (
        db_id(@DB), 
        OBJECT_ID(@Table), 
        NULL,
        NULL , 
        'LIMITED'
    ) as IPS
JOIN sys.indexes as SI WITH (nolock) 
    ON IPS.object_id = SI.object_id 
    AND IPS.index_id = SI.index_id
ORDER BY 1,3,5

Per il ripensamento automatico puoi semplicemente controllare master.sys.databases:

select * from master.sys.databases
where is_auto_shrink_on = 1

+1, grazie proprio quello che mi serve. Il mio "solo" comunque è, vedo che alcuni database non restituiscono alcun risultato, è solo perché hanno bisogno di avere statistiche fisiche nel sysdb?
Jakub

@Jakub - sì. Questo script ignora anche gli heap (tabelle non indicizzate), quindi se non ci sono tabelle indicizzate in un DB non verrà visualizzato neanche.
JNK
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.