La forma más eficiente de obtener estadísticas en una base de datos completa de SQL Server

8

Lo que quiero hacer es revisar nuestras bases de datos y bloquear cualquier auto-shrinkconfiguración, así como obtener un control sobre qué bases de datos / tablas están altamente fragmentadas.

¿Hay un script en particular que pueda ejecutar para tener una buena idea por base de datos?

Sé que puedo ejecutar lo siguiente en un nivel por tabla (SQL Server 2005 al menos):

DBCC SHOWCONTIG ('DB.TABLE');

Pero, ¿qué puedo ejecutar para mostrarme todas las tablas en una base de datos?

Gracias

Jakub
fuente

Respuestas:

6

Para verificar la fragmentación en 2005/2008, puede usar el siguiente script. Necesita establecer los valores @DBy @Table. Si los define como NULLse ejecutará en todas las bases de datos y / o todas las tablas. Si haces una única base de datos, asegúrate de ejecutarla en el contexto de ese 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

Para el autoencogimiento, simplemente puede verificar master.sys.databases:

select * from master.sys.databases
where is_auto_shrink_on = 1
JNK
fuente
+1, gracias justo lo que necesito. Sin embargo, mi "único" es que veo que algunas bases de datos no devuelven ningún resultado, ¿es solo porque necesitan tener estadísticas físicas en la base de datos sys?
Jakub
@Jakub - sí. Este script también ignora los montones (tablas no indexadas), por lo que si no hay tablas indexadas en un DB, tampoco aparecerá.
JNK