A maneira mais eficiente de obter estatísticas em um banco de dados inteiro do SQL Server

8

O que estou procurando fazer é revisar nossos bancos de dados e bloquear todas as auto-shrinkconfigurações, além de obter uma identificação sobre quais bancos de dados / tabelas são altamente fragmentados.

Existe um script específico que eu possa executar para obter uma boa ideia por banco de dados?

Eu sei que posso executar o seguinte em um nível por tabela (pelo menos no SQL Server 2005):

DBCC SHOWCONTIG ('DB.TABLE');

Mas o que posso executar para me mostrar todas as tabelas em um banco de dados?

obrigado

Jakub
fonte

Respostas:

6

Para verificar a fragmentação em 2005/2008, você pode usar o seguinte script. Você precisa definir os valores @DBe @Table. Se você os definir NULL, ele será executado em todos os bancos de dados e / ou em todas as tabelas. Se você fizer um único banco de dados, execute no contexto desse banco de dados ( 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

Para o autoshrink, basta verificar master.sys.databases:

select * from master.sys.databases
where is_auto_shrink_on = 1
JNK
fonte
+1, obrigado exatamente o que eu preciso. Meu 'único', no entanto, é que vejo alguns bancos de dados não retornarem nenhum resultado, é apenas porque eles precisam ter estatísticas físicas no sysbanco de dados?
Jakub
@Jakub - sim. Esse script também ignora heaps (tabelas não indexadas), portanto, se não houver tabelas indexadas em um banco de dados, ele também não será exibido.
JNK