Der effizienteste Weg, um Statistiken für eine gesamte SQL Server-Datenbank abzurufen

8

Ich möchte unsere Datenbanken überprüfen und alle auto-shrinkEinstellungen sperren sowie einen Überblick darüber erhalten, welche Datenbanken / Tabellen stark fragmentiert sind.

Gibt es ein bestimmtes Skript, das ich ausführen kann, um eine gute Vorstellung von jeder Datenbank zu bekommen?

Ich weiß, dass ich Folgendes auf Tabellenebene ausführen kann (mindestens SQL Server 2005):

DBCC SHOWCONTIG ('DB.TABLE');

Aber was kann ich ausführen, um mir alle Tabellen in einer Datenbank anzuzeigen?

Vielen Dank

Jakub
quelle

Antworten:

6

Zur Überprüfung der Fragmentierung in 2005/2008 können Sie das folgende Skript verwenden. Sie müssen die Werte @DBund einstellen @Table. Wenn Sie diese als definieren NULL, wird sie auf allen Datenbanken und / oder allen Tabellen ausgeführt. Wenn Sie eine einzelne Datenbank ausführen, stellen Sie sicher, dass Sie diese im Kontext dieser Datenbank ausführen ( 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

Für Autoshrink können Sie einfach überprüfen master.sys.databases:

select * from master.sys.databases
where is_auto_shrink_on = 1
JNK
quelle
+1, danke genau das, was ich brauche. Mein "einziges" ist jedoch, dass einige Datenbanken überhaupt kein Ergebnis zurückgeben. Ist das nur so, weil sie physische Statistiken in der Datenbank benötigen sys?
Jakub
@ Jakub - yep. Dieses Skript ignoriert auch Heaps (nicht indizierte Tabellen). Wenn also keine indizierten Tabellen in einer Datenbank vorhanden sind, wird es auch nicht angezeigt.
JNK