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

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

+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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.