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.